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的行