私信sql查询列表结果对不上


这是私信表的设计

字段说明:
id:私信主键,自增
user_id:私信的主人
friend_id:对方的id
sender:发送者
receiver:接受者
type:类型(normal 和 system)
content:内容
send_time:发送时间
read_time:阅读时间
status:私信状态(已读 和 未读)

借鉴oschina的留言来做:(冗余来换性能的思路)
一条私信保存两条记录,因为每个人都有收到的私信和已发送私信,当发送人删除了已发送私信,不会影响到接收人查看收到的私信。

假如,当 A 给 B 发送一条私信时,会往表中插入两条相同的记录,唯一不同的是 user 和 friend 这两个字段的值是对调的,当然 id 因为是自增长的所以也不同。

记录1. user_id=A,friend_id=B,sender=A,receiver=B
记录2. user_id=B,friend_id=A,sender=A,receiver=B

其实目的就是:
1:在私信列表展示我私信他人和他人私信我的列表,并显示最新的一条私信信息

私信列表
2:为了跟微博私信那种方便在界面显示对话,说了这么多最终的问题是在私信列表展示查询遇到了问题,写了一段sql,但是最终的结果往往对不上,在此我贴上我的sql,希望德问的前辈们帮助小弟下。在此谢过!

sql:

   
  select s.id, count(distinct(s.friend_id)), s.sender, s.receiver, s.user_id, s.friend_id, s.content, s.send_time, s.`name`, s.head_url
  
from (select sm.id, sm.sender, sm.receiver, sm.user_id, sm.friend_id, sm.content, sm.send_time, ud.name, ud.head_url from ss_secret_msg as sm
left join ss_user_data as ud on sm.user_id = ud.id where sm.user_id = 139 order by sm.send_time asc) as s
group by s.friend_id

java Web开发

evajc 8 years, 11 months ago

这个问题,简化下就是 分组保留最新一条数据的问题;

在你的sql 基础上 只要把 asc 改成desc 就可以了。 另外可以把按照时间排序,改为用id排序。时间最大的其实也就是id最大的。

另外一些 分组保留最新数据的方法可以参考以下几个问答。效率比较这个高:

http://www.dewen.io/q/3495
http://www.dewen.io/q/11620
http://www.dewen.io/q/12364
http://www.dewen.io/q/4941

狂気DNEET answered 8 years, 11 months ago

Your Answer