sql:查出每个联系人最新的1条消息

要从数据库的消息表里查出最近跟哪些人聊了天,从而生成聊天列表。
麻烦点:

  1. 消息里我可以是发送者也是接收者,还有可能不是我的消息,有其他人登录过了
  2. 每个人最新的,而不是一起最新的,要分组

这是初始数据:


初始数据

第一步先生成一个中间表:

select id, (case 
    when sender=0 then receiver
    when receiver=0 then sender 
    else -1 end)other, time, msg from message ;

用了一个case when,判断发送者是我,那么就取接受者,接收者是我,就取发送者,否则取-1,因为id都是正数,后面用来剔除。


形成other

第二步使用other分组,但是如果使用group by,那么每一列要独立的使用聚合函数,比如:

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最大的时候的那条消息的msg,但各个列是独立的聚合的,没法指定msg使用time那一列的跟随数据。还有id也是一样,最大的id跟最大time可能不是在一条消息里。

要处理这个就用到了left join:

//建了一个视图,用来代替这个中间表
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

left join的时候,重点是where u2.time is null这个,当没有比u1.time更大的u2.time的时候,它就是null,这也表示这时u1.time是最大的。

结果

你可能感兴趣的:(sql:查出每个联系人最新的1条消息)