Mysql 检索用户是参与者的每个会话的最后一条消息
我有一个名为Mysql 检索用户是参与者的每个会话的最后一条消息,mysql,sql,Mysql,Sql,我有一个名为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
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)
最简单的查询是什么,可以检索用户是参与者的每次对话的最后一条消息(发件人-来自\u id
或收件人-至\u 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
你可以在@EmanuilRusev中查看我更新的演示。谢谢你的编辑,它好多了。请不要觉得我在挑剔你。我只是想让你问一个让其他用户更容易帮助的问题,如果你的问题有助于解决他们的问题,这也会让来到网站的用户有一个更好的想法。对不起,我很困惑。你说你应该得到的数据(“结果应该是”)看起来像是你说你不想得到的数据(“用户发送的最后一个问题和收到的最后一个问题”)。@EmanuilRusev最新版本是基于哪个列的
id
?或者你有日期时间吗?@bluefeet是的,它可以是基于id
@MattEllen的最新日期时间。问题是这些结果属于同一个对话。每个会话只应检索一条消息,并且应该是最后一条消息(id最高的id
)。我正准备提交类似的内容。如果用户是多个会话的最后一条消息的接收者,则似乎不起作用:我选择了一行(最后一行)对于每个对话,很容易只选择from或to列中有1的行