【问题标题】:Retrieving the last message of each conversation where a user is a participent检索用户作为参与者的每个对话的最后一条消息
【发布时间】:2015-02-10 00:56:49
【问题描述】:

我有一张桌子叫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`
)

它的问题在于,在用户既是发件人又是收件人的对话中,它会同时检索用户发送的最后一条消息和用户收到的最后一条消息。

【问题讨论】:

  • @EmanuilRusev 感谢您的编辑,它好多了。请不要觉得我在挑剔您。我只是想让您提出一个可以让其他用户更容易提供帮助的问题,它还可以让访问该网站的用户更好地了解您的问题是否有助于解决他们的问题。
  • 对不起,我很困惑。你说你应该得到的数据(“结果应该是”)看起来像你说你不想得到的数据(“用户发送的最后一个问题和它收到的最后一个问题”)。跨度>
  • @EmanuilRusev 最新基于哪一栏 - id?或者你有约会时间吗?
  • @bluefeet 是的,它可以是基于id 的最新版本。
  • @MattEllen 问题是这些结果属于同一个对话。每个对话只能检索一条消息,并且应该是最后一条(id 最高的一条)。

标签: mysql sql


【解决方案1】:

编辑:

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查看我更新的演示

【讨论】:

  • 我正要提交类似的东西。
  • 在用户是多个对话的最后一条消息的接收者的情况下似乎不起作用:sqlfiddle.com/#!2/920dc/1
  • 我为每个对话选择一行(最后一行),然后很容易只选择 from 或 to 列中带有 1 的行
猜你喜欢
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 2016-05-09
  • 2014-12-30
  • 2016-03-24
  • 1970-01-01
相关资源
最近更新 更多