gpt4 book ai didi

MySQL如何解决一对一关系

转载 作者:行者123 更新时间:2023-11-29 06:39:43 25 4
gpt4 key购买 nike

我有一个使用 MySQL 的一对一聊天实现。目标是为一个用户获取与最后一条消息的所有唯一对话。即使我在主键上使用 MAX 并按第二列分组,MySQL 也会拒绝这一点。

以下查询给出错误:SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含非聚合列“m.id”,该列在功能上不依赖于 GROUP BY 子句中的列;

我使用的是 MySQL 版本 8。

我在这里缺少什么?

消息表

id | member_a_id | member_a_status | member_b_id | member_b_status | conversation_id | content | created_dt

对话表

id | member_a_id | member_a_status | member_b_id | member_b_status | conversation_id | content | created_dt | last_activity_dt

查询:

SELECT
MAX(m.id) AS msgid, m.*
FROM
message m
WHERE m.conversation_id IN
(SELECT
c.id
FROM
conversation c
WHERE (
c.member_a_id = 600
AND c.member_a_status NOT IN (0, 3)
)
OR (
c.member_b_id = 600
AND c.member_b_status NOT IN (0, 3)
))
GROUP BY m.conversation_id
ORDER BY m.id DESC;

最佳答案

如果没有示例数据,您的问题有点难以理解。但是,如果您使用 MySQL 8+,则应该使用窗口函数。查询看起来像这样:

SELECT cm.*
FROM (SELECT m.*,
ROW_NUMBER() OVER (PARTITION BY m.conversation_id ORDE BY m.id DESC) as seqnum
FROM message m JOIN
conversion c
ON m.conversation_id = c.conversation_id
WHERE 600 IN (c.member_a_id, c.member_b_id) AND
c.member_a_status NOT IN (0, 3)
) mc
WHERE seqnum = 1;

关于MySQL如何解决一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52263949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com