mysql - 检索用户作为参与者的每个对话的最后一条消息

标签 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       | 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/

相关文章:

php - MySQL添加函数计算变量

php - 如何使用 Eloquent 选择聚合

php - 将 DATE 2012-09-16 转换为 php 日期 ("l F jS") (PHP/mySQL)

MySQL Select 使用 IN 和 GROUP BY

MySQL REGEX 表示一个换行符

sql - 有没有办法使用存储过程创建 Excel 文件?

sql - 有没有办法从表1中获取TOP N记录,其中N基于表2

c++ - C++ 应用程序中的 SQL 查询最小化/缓存

sql - Neo4j 比 SQL 快吗?

sql - 检查两列相同的长条件