1 回答
TA贡献1820条经验 获得超10个赞
您可以使用NOT EXISTS具有相关子查询的条件来过滤表。该条件确保不存在具有相同发件人/收件人或收件人/发件人元组和更长发送时间的其他记录:
SELECT t.*
FROM OneToOneMessages t
WHERE NOT EXISTS (
SELECT 1
FROM OneToOneMessages t1
WHERE
(
t.AuthorID = t1.AuthorID AND t.RecipientID = t1.RecipientID)
OR t.RecipientID = t1.AuthorID AND t.AuthorID = t1.RecipientID
)
AND t1.SentTime > t.SentTime
)
如果您使用的是 MySQL 8.0,则可以使用窗口函数更有效地完成此操作ROW_NUMBER():
SELECT *
FROM (
SELECT
t.*,
ROW_NUMBER() OVER(
PARTITION BY LEAST(AuthorID, RecipientID), GREATEST(AuthorID, RecipientID)
ORDER BY SentTime DESC
) rn
FROM OneToOneMessages t
)x
WHERE rn = 1
内部查询通过在具有相同发件人/收件人或收件人/发件人元组的记录组中降低发送时间来对记录进行排名。外部查询仅过滤每个组中的顶部记录。
- 1 回答
- 0 关注
- 116 浏览
添加回答
举报