mysql—(my)sql—用于显示最后一个收件箱中的消息

ctrmrzij  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(334)

所以希望这个问题没有被问到,但我没有发现。
我的示例表如下所示:https://imgur.com/a/bbykp
例如,对于我的sql,我知道用户id为1,我想显示我的messanger的收件箱,因为我需要知道用户id 1是否收到了一条消息或者是一条消息的发送者。
例如:

sender_id receiver_id
  1         2
  3         1
  1         4
 12         1

应该给我四个id为1的收件箱结果。
所以我现在坚持

SELECT * FROM chats AS tm 
WHERE tm.id IN
(SELECT MAX(id) FROM chats WHERE sender_id = 1 OR receiver_id = 1 GROUP BY receiver_id)

这让我明白:https://imgur.com/a/p665t
你会发现我不需要id 2,但我喜欢id 3,因为它是那个对话的最新消息。
那么,如何使用sql来确定我想要的是发送方id 1还是接收方id 1的最新版本呢?
谢谢您!

nmpmafwu

nmpmafwu1#

一个选项使用最小/最大的技巧:

SELECT t1.*
FROM chats t1
INNER JOIN
(
    SELECT
        LEAST(sender_id, receiver_id) AS sender_id,
        GREATEST(sender_id, receiver_id) AS receiver_id,
        MAX(updated_at) AS max_updated_at
    FROM chats
    GROUP BY
        LEAST(sender_id, receiver_id),
        GREATEST(sender_id, receiver_id)
) t2
    ON LEAST(t1.sender_id, t1.receiver_id) = t2.sender_id AND
       GREATEST(t1.sender_id, t1.receiver_id) = t2.receiver_id AND
       t1.updated_at = t2.max_updated_at;

演示

ej83mcc0

ej83mcc02#

选择*from chats as tm where tm.id in(选择max(id)from chats where sender\u id=1 or receiver\u id=1 group by receiver\u id)
你可以试试这样的上衣
从发送者id=1或接收者id=1的聊天中选择id order by id desc
限制1
这是聊天中的最后一行,其中包含id为1的发件人或收件人
第一个是一个近似值吗´(次优)

相关问题