从每个对话sql获取最后一条消息

时间:2016-06-29 22:16:26

标签: 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 | 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;

4 个答案:

答案 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