一个 MySQL 查询问题

2021-11-22 10:47:35 +08:00
 Macv1994

有一张私信表表结构如下图

我想把当前用户的所有私信查询出来,我现在使用的下面的查询语句

# 假设当前用户 id 为 12
select * from t_message where receiver_id == 12 group by sender_id;

但是这样有两个问题

  1. 如果是 12 用户给其他用户发送的私信,如果对方没有回复的话,那么就查询不出来。
  2. MySQL5.7 以后默认开启了ONLY_FULL_GROUP_BY,用上面的查询语句会报错,要关掉才可以。

请求各位大佬,怎么解决小弟这个问题?

1637 次点击
所在节点    程序员
17 条回复
onhao
2021-11-22 13:55:41 +08:00
mysql8 only_full_group_by 的解决办法 https://wuhao.pw/archives/179/
onhao
2021-11-22 13:59:48 +08:00
@Macv1994 "如果是 12 用户给其他用户发送的私信,如果对方没有回复的话" 那么 sender_id 是 12 ?
mysql 好像 receiver_id = 12 这样 就行吧 不需要==
可能是我理解的问题, 这样不知可否
select * from t_message where receiver_id = 12 or sender_id=12 group by sender_id;
cdcdc
2021-11-22 16:00:21 +08:00
如果只是为了去重,就用 select xxx, DISTINCT sender_id WHERE receiver_id = 12
Macv1994
2021-11-23 09:28:50 +08:00
@onhao ONLY_FULL_GROUP_BY 通过查看文档可以通过 ANY_VALUE 来解决。
onhao
2021-11-23 10:05:21 +08:00
@Macv1994 确实,采用 any_value() 似乎更加好。
只是你的问题,最终怎么解决的?
qianProgrammer
2021-11-23 10:56:58 +08:00
select * from t_message where receiver_id = 12
UNION
select * from t_message where sender_id = 12
mitsuizzz
2021-11-23 10:59:38 +08:00
发送人或者接收人 id 为 12 不就都查出来了,我理解一行对应一条私信,查出所有私信为什么还要分组
lybcyd
2021-11-23 13:45:10 +08:00
为什么需要 group by ,一个发送人只显示一条吗?能明确一下规则么
Macv1994
2021-11-23 15:48:54 +08:00
@mitsuizzz
@lybcyd 我没有表述清楚,因为我要做一个类似微信聊天左侧侧边栏的效果 不知道是不是我想复杂了 https://2dogz.cn/backend/files/5076image.png
Macv1994
2021-11-23 15:49:57 +08:00
@onhao 我最后分开两个 SQL 进行 group by😂
DefineJ
2021-11-23 17:47:53 +08:00
我今天刚把聊天记录和列表拆分出来,列表只记录最后一次聊天
DefineJ
2021-11-23 17:50:00 +08:00
lybcyd
2021-11-23 18:00:06 +08:00
@Macv1994 那按照业务逻辑应该是需要时间倒序的,group by 排序我记得是没有保证的,查询非 group by 和非聚合字段也不符合 SQL 标准。
如果用的 MySQL8 可以用开窗函数,如果是 5.7 那就子查询按照对话双方来分组查询最新时间。
因为这里是对话,应该需要按照 receiver 和 sender 两个字段分组吧。
MidGap
2021-11-23 18:04:18 +08:00
@Macv1994 用 zset 维护个联系人列表似乎可以,score 是最后一次消息的时间,排序也省了
Macv1994
2021-11-24 09:28:23 +08:00
@lybcyd 嗯是的,group by 可以通过 any_value 来解决,我现在是分开查询的,先把根据 sender_id 分组条件为 receiver_id=12 ,然后将条件设置为 sender_id=12 and receiver_id not in [group by sender_id]
Macv1994
2021-11-24 09:28:38 +08:00
@DefineJ 感谢,我看一下。
Macv1994
2021-11-24 09:29:33 +08:00
@MidGap 你是说用 redis 的 zset 吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/817054

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX