MYSQL选择不同的聊天对话

MYSQL选择不同的聊天对话,mysql,chat,distinct,Mysql,Chat,Distinct,我试图通过最新消息在两个用户之间获得不同的对话。我迷路了 我的桌子摆得很整齐 iD | From | to | Message | Read | Created_at 1 | 2 | 1 | blah1 | 0 | 2019-01-11 02:15:24 2 | 1 | 2 | blah2 | 0 | 2019-01-11 02:16:24 3 | 2 | 1 | blah3 | 0

我试图通过最新消息在两个用户之间获得不同的对话。我迷路了

我的桌子摆得很整齐

iD |  From  |  to  |  Message | Read |   Created_at
1  |   2    |   1  |  blah1   |   0  |   2019-01-11 02:15:24
2  |   1    |   2  |  blah2   |   0  |   2019-01-11 02:16:24
3  |   2    |   1  |  blah3   |   0  |   2019-01-11 02:17:24
4  |   2    |   3  |  blah4   |   0  |   2019-01-11 02:18:24
5  |   1    |   5  |  blah5   |   0  |   2019-01-11 02:19:24
6  |   1    |   3  |  blah6   |   0  |   2019-01-11 02:20:24
我想要每次谈话的结果,不要重复

比如说。如果选择用户ID为1的所有对话。我需要这样的结果

iD |  From  |  to  |  Message | Read |   Created_at
3  |   2    |   1  |  blah3   |   0  |   2019-01-11 02:17:24
5  |   1    |   5  |  blah5   |   0  |   2019-01-11 02:19:24
6  |   1    |   3  |  blah6   |   0  |   2019-01-11 02:20:24
我尝试过的每件事都会导致1对2和2对1的对话重复


我在这里寻找的一切都不适合我

在我的示例中,您可以获取给定用户(我使用的是用户1)与使用此查询的任何其他用户之间的最新对话时间:

SELECT CASE WHEN `From` = 1 THEN `To` ELSE `From` END AS other, MAX(Created_at) AS latest
FROM conversations
WHERE `From` = 1 OR `To` = 1
GROUP BY other
接下来的问题就是将其加入整个表中,以获得两个用户之间最新消息的详细信息:

SELECT c.*
FROM conversations c
JOIN (SELECT CASE WHEN `From` = 1 THEN `To` ELSE `From` END AS other, MAX(Created_at) AS latest
      FROM conversations
      WHERE `From` = 1 OR `To` = 1
      GROUP BY other) m
  ON (c.From = 1 AND c.To = m.other OR c.To = 1 AND c.From = m.other) AND c.Created_at = m.latest
输出:

iD  From    to  Message     Read    Created_at
3   2       1   blah3       0       2019-01-11 02:17:24
5   1       5   blah5       0       2019-01-11 02:19:24
6   1       3   blah6       0       2019-01-11 02:20:24

在我的示例“我使用用户1”中,您可以获取给定用户与使用此查询的任何其他用户之间的最新对话时间:

SELECT CASE WHEN `From` = 1 THEN `To` ELSE `From` END AS other, MAX(Created_at) AS latest
FROM conversations
WHERE `From` = 1 OR `To` = 1
GROUP BY other
接下来的问题就是将其加入整个表中,以获得两个用户之间最新消息的详细信息:

SELECT c.*
FROM conversations c
JOIN (SELECT CASE WHEN `From` = 1 THEN `To` ELSE `From` END AS other, MAX(Created_at) AS latest
      FROM conversations
      WHERE `From` = 1 OR `To` = 1
      GROUP BY other) m
  ON (c.From = 1 AND c.To = m.other OR c.To = 1 AND c.From = m.other) AND c.Created_at = m.latest
输出:

iD  From    to  Message     Read    Created_at
3   2       1   blah3       0       2019-01-11 02:17:24
5   1       5   blah5       0       2019-01-11 02:19:24
6   1       3   blah6       0       2019-01-11 02:20:24

为什么iD为1或2的行不包括在用户iD为1的行中,因为它们有与1匹配的From/to字段。请选择。。。其中From=1或To=1?重复的对话实际上是什么样子的?对不起,应该澄清一下,id 1和id 2是id 3对话的一部分。我想获取包含最新消息的对话列表。3是最新消息为什么用户iD 1不包含iD=1或2的行,因为它们的“发件人/收件人”字段也与1匹配选择。。。其中From=1或To=1?重复的对话实际上是什么样子的?对不起,应该澄清一下,id 1和id 2是id 3对话的一部分。我想获得一个对话列表,其中包含最新消息。3是最新消息这正是我所需要的!我离得很近,但是很远,哈哈。谢谢@瑞安诺不用担心。很高兴我能帮忙。这正是我需要的!我离得很近,但是很远,哈哈。谢谢@瑞安诺不用担心。很高兴我能帮忙。