要從數(shù)據(jù)庫的消息表里查出最近跟哪些人聊了天疙筹,從而生成聊天列表沛硅。
麻煩點(diǎn):
- 消息里我可以是發(fā)送者也是接收者福青,還有可能不是我的消息摄狱,有其他人登錄過了
- 每個(gè)人最新的,而不是一起最新的无午,要分組
這是初始數(shù)據(jù):
第一步先生成一個(gè)中間表:
select id, (case
when sender=0 then receiver
when receiver=0 then sender
else -1 end)other, time, msg from message ;
用了一個(gè)case when媒役,判斷發(fā)送者是我,那么就取接受者宪迟,接收者是我酣衷,就取發(fā)送者,否則取-1次泽,因?yàn)閕d都是正數(shù)穿仪,后面用來剔除。
第二步使用other分組意荤,但是如果使用group by,那么每一列要獨(dú)立的使用聚合函數(shù)啊片,比如:
select max(id), other, max(time),max(msg) from (select id, (case
when sender=0 then receiver
when receiver=0 then sender
else -1 end)other, time, msg from message) o group by other;
msg那一列我們肯定是希望是time最大的時(shí)候的那條消息的msg,但各個(gè)列是獨(dú)立的聚合的,沒法指定msg使用time那一列的跟隨數(shù)據(jù)玖像。還有id也是一樣紫谷,最大的id跟最大time可能不是在一條消息里。
要處理這個(gè)就用到了left join:
//建了一個(gè)視圖,用來代替這個(gè)中間表
CREATE VIEW user_other AS
select id, (case
when sender=0 then receiver
when receiver=0 then sender
else -1 end)other, time, msg from message ;
select u1.id, u1.other, u1.time, u1.msg from
user_other u1
left join user_other u2 on
u1.other = u2.other and u1.time<u2.time
where u2.time is null and u1.other != -1;
left join的時(shí)候笤昨,重點(diǎn)是where u2.time is null
這個(gè)祖驱,當(dāng)沒有比u1.time更大的u2.time的時(shí)候,它就是null,這也表示這時(shí)u1.time是最大的瞒窒。