• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Macv1994
V2EX  ›  程序员

一个 MySQL 查询问题

  •  
  •   Macv1994 ·
    weijiang1994 · Nov 22, 2021 via Android · 2653 views
    This topic created in 1811 days ago, the information mentioned may be changed or developed.

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

    1637548753322.png

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

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

    但是这样有两个问题

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

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

    17 replies  •  2021-11-24 09:29:33 +08:00
    onhao
    onhao
    Nov 22, 2021
    1
    mysql8 only_full_group_by 的解决办法 https://wuhao.pw/archives/179/
    onhao
    onhao
    Nov 22, 2021
    2
    @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
    cdcdc
    Nov 22, 2021
    3
    如果只是为了去重,就用 select xxx, DISTINCT sender_id WHERE receiver_id = 12
    Macv1994
    Macv1994
    OP
    Nov 23, 2021
    4
    @onhao ONLY_FULL_GROUP_BY 通过查看文档可以通过 ANY_VALUE 来解决。
    onhao
    onhao
    Nov 23, 2021
    5
    @Macv1994 确实,采用 any_value() 似乎更加好。
    只是你的问题,最终怎么解决的?
    qianProgrammer
    qianProgrammer
    Nov 23, 2021
    6
    select * from t_message where receiver_id = 12
    UNION
    select * from t_message where sender_id = 12
    mitsuizzz
    mitsuizzz
    Nov 23, 2021
    7
    发送人或者接收人 id 为 12 不就都查出来了,我理解一行对应一条私信,查出所有私信为什么还要分组
    lybcyd
    lybcyd
    Nov 23, 2021
    8
    为什么需要 group by ,一个发送人只显示一条吗?能明确一下规则么
    Macv1994
    Macv1994
    OP
    Nov 23, 2021 via Android
    9
    @mitsuizzz
    @lybcyd 我没有表述清楚,因为我要做一个类似微信聊天左侧侧边栏的效果 不知道是不是我想复杂了 https://2dogz.cn/backend/files/5076image.png
    Macv1994
    Macv1994
    OP
    Nov 23, 2021 via Android
    10
    @onhao 我最后分开两个 SQL 进行 group by😂
    DefineJ
    DefineJ
    Nov 23, 2021
    11
    我今天刚把聊天记录和列表拆分出来,列表只记录最后一次聊天
    lybcyd
    lybcyd
    Nov 23, 2021 via Android
    13
    @Macv1994 那按照业务逻辑应该是需要时间倒序的,group by 排序我记得是没有保证的,查询非 group by 和非聚合字段也不符合 SQL 标准。
    如果用的 MySQL8 可以用开窗函数,如果是 5.7 那就子查询按照对话双方来分组查询最新时间。
    因为这里是对话,应该需要按照 receiver 和 sender 两个字段分组吧。
    MidGap
    MidGap
    Nov 23, 2021
    14
    @Macv1994 用 zset 维护个联系人列表似乎可以,score 是最后一次消息的时间,排序也省了
    Macv1994
    Macv1994
    OP
    Nov 24, 2021
    15
    @lybcyd 嗯是的,group by 可以通过 any_value 来解决,我现在是分开查询的,先把根据 sender_id 分组条件为 receiver_id=12 ,然后将条件设置为 sender_id=12 and receiver_id not in [group by sender_id]
    Macv1994
    Macv1994
    OP
    Nov 24, 2021
    16
    @DefineJ 感谢,我看一下。
    Macv1994
    Macv1994
    OP
    Nov 24, 2021
    17
    @MidGap 你是说用 redis 的 zset 吗?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1846 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 09:23 · PVG 17:23 · LAX 01:23 · JFK 04:23
    ♥ Do have faith in what you're doing.