2014-11-22 2 views
0

У меня есть таблица в mysql. Какая структура:MySql SQL Query of Group by and Order by

id sender receiver  time    message 
------------------------------------------------------- 
1  23   34  2014-11-02 14:55:02  1 
2  22   34  2014-11-02 16:55:02  2 
3  21   35  2014-11-02 16:55:02  5 
4  23   34  2014-11-02 16:55:02  2 
5  22   35  2014-11-02 16:55:02  1 

Теперь мне нужно сделать запрос, который будет получать последнее сообщение конкретного приемника от конкретного отправителя, если сообщение является более one.Otherwise он дает одну строку. Здесь я хочу сделать запрос с идентификатором приемника id = 34, и он должен дать мне 4-ю строку и вторую строку. то есть

2  22   34  2014-11-02 16:55:02  2 
4  23   34  2014-11-02 16:55:02  2 

Здесь я не спрашиваю определенное количество строк из db. Это разговор db. И я хочу список разговоров пользователя. И когда для одного и того же отправителя и получателя имеется несколько строк, мне нужен последний разговор.

Как это сделать?

ответ

1

Вы можете получить последний раз сообщения, используя группу, а затем использовать его в подзапросе, чтобы получить детали всех сообщений

Select * from 
table1 T 
Join(
     Select sender ,max(time) as lastTime 
     From table1 
     Where receiver = 34 
    Group by sender) T2 
On T.sender = T2.sender 
and T.time = T2.lastTime 
And T.receiver = 34 
+1

две вещи: У вас есть опечатка в последней строке, где вы сказали 'T1.lastTime' и вы должны включать' WHERE приемник = 34' во внешнем запросе также или еще дополнительная строка может быть возвращена. В противном случае он работает. [Fiddle] (http://sqlfiddle.com/#!2/543b8/3) – AdamMc331

+1

@ McAdam331, спасибо исправлено. – radar

+0

Случилось так, что строка 5 также была возвращена, потому что она подключалась по отправителю = 22 и времени согласования, вот как я поймал ошибку приемника. – AdamMc331

1

Есть много способов его достижения и один способ заключается в использовании левого соединения затем с присоединиться Состояние группы данных и, наконец, дополнительное условие для дальнейшего фильтра

select 
m.* from messages m 
left join messages m1 on m1.receiver = m.receiver 
and m.id < m1.id 
and m.sender = m1.sender 
where m1.id is null 
and m.receiver = 34; 

Другой способ заключается в использовании exists в качестве альтернативы для group by

select m.* from messages m 
where not exists 
(
    select 1 from messages m1 
    where 
    m1.receiver = m.receiver 
    and m.id < m1.id 
    and m.sender = m1.sender 
) 
and m.receiver = 34; 

demo