[英]Get Last Message from Each Conversation sql
我有一个SQL表,其中包括用户之间的对话。 我需要从每个对话中检索最后一条消息以进行预览。
id | sender | receiver | message | date
1 | 1 | 2 | Hello | 2015-12-08 20:00
2 | 2 | 1 | Hey | 2015-12-08 20:10
3 | 2 | 1 | You there? | 2015-12-08 21:00
4 | 1 | 3 | Yes | 2015-12-08 21:15
5 | 4 | 1 | Hey buddy | 2015-12-08 22:00
我在网站上知道许多类似的问题,但我无法解决。
我尝试了此代码,但无法正常工作:
SELECT *
FROM messages
WHERE receiver = '{$id}'
GROUP BY sender
ORDER BY id DESC
LIMIT 10;
仅定义表中的对话是一件很痛苦的事情,我想对话是所有行所在
(发件人= @ senderId和&收件人= @ receiverId)|| (发件人= @ receiverId和&收件人= @ senderId)
按这个概念分组,我什至不想去想
对我来说,您缺少一个概念,即“对话”
如果您有这样的座谈会
ConversationId | Users1 | User2
和消息一样
Id | ConversationId | UserSendingId | Message | Date
现在,您可以按ConversationId分组,并获取最后一条消息,例如
SELECT * <-- avoid * better use all row names
FROM Message
Where id in (
select max(id) from message group by ConversationId
)
对话表的表示只是一种快速的方法,您可以使用从1到许多对话以及对话中用户之间的关系来做一个更好的解决方案,以防止每个对话希望有2个以上用户时修改对话表。
我认为,如果要标识特定用户的对话,则需要选择行,这些行是发送者或接收者。
然后,要从会话中获取最新消息,可以按当前用户不是的发送者/接收者之一分组,然后选择最大ID。
SELECT * FROM messages
WHERE id IN (
SELECT MAX(id) AS last_msg_id
FROM messages WHERE receiver = ? OR sender = ?
GROUP BY IF(sender = ?, receiver, sender)
)
不过,我认为此查询的效果不会很好。 我同意另一个答案,即如果在数据库中定义了对话,则查询对话会更容易。
例如:
SELECT x.*
FROM my_table x
JOIN
( SELECT LEAST(sender,receiver) user1
, GREATEST(sender,receiver) user2
, MAX(date) date
FROM my_table
GROUP
BY user1
, user2
) y
ON LEAST(sender,receiver) = user1
AND GREATEST(sender,receiver) = user2
AND y.date = x.date;
SELECT m.id, m.added_date, m.message, u.username, u.image, m.from_id, m.to_id
FROM tbp_registration AS u
LEFT JOIN tbp_chats AS m ON m.from_id = u.id
WHERE m.id IN (
SELECT MAX(id)
FROM tbp_chats
WHERE from_id = '$user_id' OR to_id = '$user_id'
GROUP BY LEAST(from_id, to_id), GREATEST(from_id, to_id)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.