Php 从每个sql会话中获取最后一条消息
我有一个sql表,其中包括用户之间的对话。我需要从每个对话中检索最后一条消息,以便预览它Php 从每个sql会话中获取最后一条消息,php,mysql,sql,Php,Mysql,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
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&&receiver=@receiverId | |发送者=@receiverId&& 接收器=@senderId 根据这个概念,我甚至不想去想它 对我来说,你错过了一个概念,一个对话 如果你有这样的餐桌谈话
ConversationId | Users1 | User2
和信息一样
Id | ConversationId | UserSendingId | Message | Date
SELECT * <-- avoid * better use all row names
FROM Message
Where id in (
select max(id) from message group by ConversationId
)
现在,您可以按ConversationId分组,并接收最后一条消息,如
Id | ConversationId | UserSendingId | Message | Date
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;
我尝试了这个代码,但没有正常工作。从消息中选择*,其中接收方=“{$id}”组按发送方顺序按id描述限制10A接收方id不构成对话,而是发送方id和接收方id一起使对话唯一。例如,请参见表格的第一行和第二行。我相信您遇到的问题是,在一次对话中,用户可以既是发送者又是接收者。仅仅根据接收者进行选择就意味着你错过了一半的对话。但是它与其他对话有什么不同呢?我认为op的模式很好谢谢你的回答@deumber我添加了对话栏。按对话顺序按id描述限制10从消息中选择*从消息中选择id从消息组中选择MAXid