繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM