mysql:按用户获取最后一次对话记录[重复]

Posted

技术标签:

【中文标题】mysql:按用户获取最后一次对话记录[重复]【英文标题】:mysql: Get last conversation records by user [duplicate] 【发布时间】:2016-10-09 17:43:00 【问题描述】:

我需要按降序获取 to_user 的最后一次对话记录。 我有一个名为消息的表。请查看以下屏幕截图:

我希望以下列方式输出:

 from_user| to_user | message         | 
  241     |  226    |   How are you?  |
  241     |  256    | Hi test message |

我试过这个查询:

SELECT * FROM `messages` where from_user=241 group by to_user order by created DESC

我得到以下错误的输出:

提前致谢。

【问题讨论】:

你为什么按to_user分组?如果您这样做,您将不得不聚合您选择的字段。您可以使用 group_concat() 来连接发送的不同消息。但是在分组时,顺序没有多大意义,因为分组的条目具有不同的日期,因此您必须指定是否要按不同组的最新消息或最旧消息进行分组。 【参考方案1】:

如果您希望 from_user 的所有帖子在一个字段中(误解了我认为的问题):

SELECT group_concat(messages.message) 
    FROM messages 
    WHERE from_user = 241 
    GROUP BY to_user 
    ORDER BY MAX(id) DESC

您必须说明您希望按照哪些标准对其进行排序。您可以拥有对话的开始或对话的最后一条消息。

【讨论】:

【参考方案2】:
SELECT *
FROM
  (SELECT *
   FROM `messages`
   WHERE from_user=241
   ORDER BY created DESC) as test
GROUP BY to_user

【讨论】:

应在子查询中添加 LIMIT 1 以仅返回最新条目。 没有限制也没关系【参考方案3】:

试试他的:

SELECT t1.* 
FROM `messages` AS t1
JOIN (
   SELECT to_user, MAX(created) AS created
   FROM `messages` 
   WHERE from_user=241
   GROUP BY to_user
) AS t2 ON t1.to_user = t2.to_user AND t1.created = t2.created
WHERE from_user=241
ORDER BY t1.created DESC

【讨论】:

太棒了!!!像魅力一样工作。非常感谢 工作正常。但是如果 to_user 发送了消息,则无法获取最后一条消息。【参考方案4】:

试试这个

SELECT * FROM `messages` where from_user=241 group by to_user order by id , created DESC

【讨论】:

谢谢,我需要每个 to_user 一个记录...如何实现? 不需要按创建日期排序,因为 id 已经显示了我认为的年表

以上是关于mysql:按用户获取最后一次对话记录[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XMPP ios8 获取最后一个对话用户?

如何将每个用户的最后一条消息显示给用户对话以保留聊天记录?

jQuery-UI 对话框仅显示 for 循环的最后一次迭代 [重复]

返回子查询中的最后一条记录 - MySQL

在关闭它之前让一个 android 对话框滚动到最后

Laravel 按最后一条消息对对话进行排序