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

发布于 2017-09-05 18:16:45 字数 1432 浏览 1222 评论 1

这是私信表的设计

字段说明:
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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

灵芸 2017-09-07 15:39:20

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文