MySQL如何解决一对一关系

标签 mysql sql

我有一个使用 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/

相关文章:

java - 在这种情况下如何插入或更新数据库行

C#和mysql,表连接

mysql - 每个派生表必须有自己的别名 - 使用多个 SELECT 语句时出错

php - 'xxx' 中的未知列 'where clause'

PHP 与 Phpmyadmin

sql - 如何使用 SUM() 等 SQL 将列中的所有值相乘

sql - 在SQL中是否需要分号?

mysql - 排行榜位置SQL优化

mysql - MySQL 是否更新所有插入的索引?我可以在每次插入 x 后更新它吗?

php - SQL 查询 - 获取两个表的不同计数