Php 从每个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

我有一个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&&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