我有一个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;
答案 0 :(得分:2)
只是为了定义表中的对话是一种痛苦,我想一个对话就是所有的行
(sender = @ senderId&& receiver = @ receiverId)|| (发送者= @ receiverId&& 接收机= @ senderId)
按照这个概念分组,我甚至不想这么想
对我来说,你错过了一个概念,#34;对话"
如果您有像这样的表格对话
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个用户时修改的会话表。
答案 1 :(得分:1)
我认为如果您想为特定用户确定对话,则需要选择他们是发件人或收件人的行。
然后,要从对话中获取最新消息,您可以按当前用户不中的任何一个发件人/接收者进行分组,然后选择最大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)
)
但我不认为这个查询会表现得很好。我同意另一个答案,如果在数据库中定义了对话,那么查询对话会更容易。
答案 2 :(得分:1)
E.g:
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;
答案 3 :(得分:0)
TESLA