MYSQL select 不同的聊天对话
MYSQL select DISTINCT chat conversations
我正在尝试通过最新消息在 2 个用户之间获得不同的对话。我迷路了。
我的 table 设置得像
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
那么这只是一个 JOIN
将其发送到整个 table 以获取两个用户之间最新消息的详细信息的问题:
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
我正在尝试通过最新消息在 2 个用户之间获得不同的对话。我迷路了。
我的 table 设置得像
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
那么这只是一个 JOIN
将其发送到整个 table 以获取两个用户之间最新消息的详细信息的问题:
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