跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 一个 MySQL 查询问题
未分類
28 2 月 2022

一个 MySQL 查询问题

一个 MySQL 查询问题

資深大佬 : Macv1994 38

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

一个 MySQL 查询问题

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

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

但是这样有两个问题

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

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

大佬有話說 (17)

  • 資深大佬 : onhao

    mysql8 only_full_group_by 的解决办法 https://wuhao.pw/archives/179/

  • 資深大佬 : onhao

    @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

    如果只是为了去重,就用 select xxx, DISTINCT sender_id WHERE receiver_id = 12

  • 主 資深大佬 : Macv1994

    @onhao ONLY_FULL_GROUP_BY 通过查看文档可以通过 ANY_VALUE 来解决。

  • 資深大佬 : onhao

    @Macv1994 确实,采用 any_value() 似乎更加好。
    只是你的问题,最终怎么解决的?

  • 資深大佬 : qianProgrammer

    select * from t_message where receiver_id = 12
    UNION
    select * from t_message where sender_id = 12

  • 資深大佬 : mitsuizzz

    发送人或者接收人 id 为 12 不就都查出来了,我理解一行对应一条私信,查出所有私信为什么还要分组

  • 資深大佬 : lybcyd

    为什么需要 group by ,一个发送人只显示一条吗?能明确一下规则么

  • 主 資深大佬 : Macv1994

    @mitsuizzz
    @lybcyd 我没有表述清楚,因为我要做一个类似微信聊天左侧侧边栏的效果 不知道是不是我想复杂了 https://2dogz.cn/backend/files/5076image.png

  • 主 資深大佬 : Macv1994

    @onhao 我最后分开两个 SQL 进行 group by

  • 資深大佬 : DefineJ

    我今天刚把聊天记录和列表拆分出来,列表只记录最后一次聊天 一个 MySQL 查询问题

  • 資深大佬 : DefineJ

    https://blog.csdn.net/weixin_42260789/article/details/119328074

  • 資深大佬 : lybcyd

    @Macv1994 那按照业务逻辑应该是需要时间倒序的,group by 排序我记得是没有保证的,查询非 group by 和非聚合字段也不符合 SQL 标准。
    如果用的 MySQL8 可以用开窗函数,如果是 5.7 那就子查询按照对话双方来分组查询最新时间。
    因为这里是对话,应该需要按照 receiver 和 sender 两个字段分组吧。

  • 資深大佬 : MidGap

    @Macv1994 用 zset 维护个联系人列表似乎可以,score 是最后一次消息的时间,排序也省了

  • 主 資深大佬 : Macv1994

    @lybcyd 嗯是的,group by 可以通过 any_value 来解决,我现在是分开查询的,先把根据 sender_id 分组条件为 receiver_id=12 ,然后将条件设置为 sender_id=12 and receiver_id not in [group by sender_id]

  • 主 資深大佬 : Macv1994

    @DefineJ 感谢,我看一下。

  • 主 資深大佬 : Macv1994

    @MidGap 你是说用 redis 的 zset 吗?

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具