我有一个名为 messages
的表:
| id | from_id | to_id | text
+----+---------+-------+------------------
| 1 | 1 | 2 | from 1 to 2
| 2 | 2 | 1 | from 2 to 1
| 3 | 1 | 3 | from 1 to 3
| 4 | 3 | 1 | from 3 to 1
| 5 | 2 | 3 | from 2 to 3
| 6 | 1 | 2 | from 1 to 2 (2)
如果用户是参与者(发件人 - from_id
或收件人 - to_id
),检索每个对话的最后一条消息的最简单查询是什么? ?
结果应该是:
| id | from_id | to_id | text
+----+---------+-------+------------------
| 4 | 3 | 1 | from 3 to 1
| 6 | 1 | 2 | from 1 to 2 (2)
这是我尝试过的:
SELECT * FROM `messages`
WHERE `id` IN (
SELECT MAX(`id`) FROM `messages`
WHERE `from_id` = 1 OR `to_id` = 1
GROUP BY `from_id`, `to_id`
)
问题在于,在用户既是发件人又是收件人的对话中,它会检索用户发送的最后一条消息和用户收到的最后一条消息。
最佳答案
编辑:
SELECT *
from messages
where id in
(
SELECT max(id)
FROM messages
GROUP BY CASE WHEN from_id > to_id THEN concat(from_id, 'chat', to_id)
ELSE concat(to_id, 'chat', from_id)
END
)
and (from_id = 1
or to_id = 1)
我使用子查询来获取每个聊天的最后一行:
SELECT max(id)
FROM messages
GROUP BY CASE WHEN from_id > to_id THEN concat(from_id, 'chat', to_id)
ELSE concat(to_id, 'chat', from_id)
END
您可以在 SQLFiddler 查看我更新的演示
关于mysql - 检索用户作为参与者的每个对话的最后一条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28412878/