简体   繁体   English

MySQL如何解决一对一关系

[英]MySQL how to solve One-to-one relation

I have a One-to-One Chat implementation with MySQL. 我有一个与MySQL的一对一聊天实现。 The goal is to got for one user all unique Conversations with the last message. 目标是为一个用户提供最后一条消息的所有唯一对话。 Even I'm using MAX on the primary key and group by 2nd column MySQL reject this. 即使我在主键上使用MAX并按第二列对MySQL进行了拒绝。

The below query give the error: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'm.id' which is not functionally dependent on columns in GROUP BY clause; 下面的查询给出错误:SELECT列表的表达式#2不在GROUP BY子句中,并且包含未聚合的列'm.id',该列在功能上不依赖于GROUP BY子句中的列;

I'm using MySQL Version 8. 我正在使用MySQL版本8。

What I'm missing here? 我在这里想念的是什么?

Message table 留言表

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

Conversation table 对话表

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

Query: 查询:

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;

Without sample data, your question is a bit hard to follow. 没有样本数据,您的问题将很难遵循。 However, you should be using window functions if you are using MySQL 8+. 但是,如果使用MySQL 8+,则应该使用窗口函数。 The query would look something like this: 查询如下所示:

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM