Mysql (My)SQL-用于显示最后一个收件箱中的邮件

Mysql (My)SQL-用于显示最后一个收件箱中的邮件,mysql,sql,Mysql,Sql,所以希望这个问题没有被问到,但我没有发现 我的示例表如下所示: 对于我的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

所以希望这个问题没有被问到,但我没有发现

我的示例表如下所示:

对于我的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)
这让我明白:

你会发现我不需要ID 2,但我喜欢ID 3,因为这是对话的最新消息

那么,我如何用SQL来决定我想要的是发送方\标识1或接收方\标识1的最新版本呢


谢谢大家!

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

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;
从聊天中选择*作为tm,其中tm.id位于从聊天中选择MAXid 其中发送方id=1或接收方id=1按接收方id分组

你可以像这样尝试Top1

从聊天中选择id 其中发送方id=1或接收方id=1,订单按id描述 限制1

这是聊天中包含id为1的发件人或收件人的最后一行


这是第一个近似值,它是次优的

哇,就是这样!现在我必须检查它的实际功能,但当我在最后一行添加时,它工作得非常完美:其中t1.sender\u id=1或t1.receiver\u id=1无图片,谢谢。有关下一次,请参见: