2014-11-22 89 views
0

我在mysql中有一個表。其結構是:MySql按分組排序的SQL查詢按

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行。即

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

這裏我不問從數據庫的特定行數。這是一個對話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'在外部查詢也要不然一個可以返回額外的行。否則,它的作品。 [小提琴](http://sqlfiddle.com/#!2/543b8/3) – AdamMc331 2014-11-22 19:57:49

+1

@ McAdam331,謝謝更正。 – radar 2014-11-22 20:08:01

+0

發生了什麼事情,第5行也被返回,因爲它連接了sender = 22和匹配時間,這就是我如何捕獲接收器錯誤。 – AdamMc331 2014-11-22 20:11:22

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