sql - 从表中选择不同的行,其中 2 列具有相同的外键(反向包含)
问题描述
我有一个包含字段 id、时间、isread、message、messagestatus、receiver 和 user 的消息表。我想检索 id 为 1 的用户发送或接收给任何其他用户的最新消息(基于时间)。
例如,如果 ID 为 1(发送者)的用户向 ID 为 2(接收者)的用户发送消息,如果 ID 为 2 的用户向 ID 为 1 的用户发送消息。只应选择它们之间发送的最新消息
我已经存在的表如下所示:
我试过了SELECT * from (SELECT MAX(time) as time ,sender,receiver from message group by sender,receiver) as f
where receiver=1 or sender=1 limit 20
但它只显示发送者、接收者和时间,而省略了其他列,如 message、id、messagestatus 和 read,而且它不查找两个用户之间发送的一般最后一条消息,而是查找 user1 和另一个之间发送的最新消息当 user1 是发送者而另一个用户是接收者时的用户,并且当 user1 是接收者而另一个用户是发送者时,也会找到最后一条消息。
解决方案
如果您想要用户“1”发送或接收的最新消息,请使用过滤,而不是group by
:
select m.*
from messages m
where 1 in (m.sender, m.receiver) and
m.time = (select max(m2.time)
from messages m2
where (m2.sender = m.sender and m2.receiver = m.receiver) or
(m2.receiver = m.sender and m2.sender = m.receiver)
);
如果两条消息可能具有完全相同的时间戳,则:
select m.*
from messages m
where 1 in (m.sender, m.receiver) and
m.id = (select id
from messages m2
where (m2.sender = m.sender and m2.receiver = m.receiver) or
(m2.receiver = m.sender and m2.sender = m.receiver)
order by m2.time desc, m2.id desc
limit 1
);
推荐阅读
- mingw - 为什么我不能在 MSYS2 中安装 MingW 包?
- node.js - nodejs mqtt客户端包收到消息后如何发送确认?
- php - PHP 患者转诊表
- oracle - PL/SQL: ORA-00947: 没有足够的值
- c# - 当 C# 项目中有大量记录时,来自 MySqlDataReader.Read() 的异常
- c++ - 如何将构造函数转换为 std::function
- linux - 如何在 shell 中编写 if-else 并将输出回显到变量
- javascript - 使用 moment.js 获取一个月内的最后一个实例
- swift - 多个命令产生资产问题(xcode11)
- python - python列表的子集基于相同列表的元素组,pythonically