mysql - 按更改时匹配的两个列分组
问题描述
我在数据库中有一个名为 Message 的表,该表如下所示:
我需要找到 gomez 与表中每个用户的最后对话消息。因此,我想创建一个将发送者和接收者用户名和分组依据与该列相结合的列。但是,我如何验证
露西+戈麦斯 == 戈麦斯+露西
到目前为止我的代码:
SELECT sender+receiver, content, dateSent
FROM MESSAGE
WHERE sender = 'Gomez' OR receiver = 'Gomez'
GROUP BY sender+receiver
ORDER BY dateSent desc;
解决方案
使用NOT EXISTS
代替GROUP BY
:
SELECT m1.*
FROM MESSAGE m1
WHERE 'Gomez' IN (m1.sender, m1.receiver)
AND NOT EXISTS (
SELECT 1
FROM MESSAGE m2
WHERE (m1.sender, m1.receiver) IN ((m2.sender, m2.receiver), (m2.receiver, m2.sender))
AND m2.dateSent > m1.dateSent
)
ORDER BY m1.dateSent DESC;
或者,如果您的 MySql 版本是 8.0+,请使用ROW_NUMBER()
窗口函数:
SELECT sender, receiver, content, dateSent
FROM (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY LEAST(sender, receiver), GREATEST(sender, receiver)
ORDER BY dateSent DESC
) rn
FROM MESSAGE
WHERE 'Gomez' IN (sender, receiver)
) m
WHERE rn = 1
ORDER BY dateSent DESC;
请参阅演示。
推荐阅读
- android - Android Kotlin - 处理多个客户端的套接字服务器
- python - 错误:3D Matlab 数组到 0 维 np 数组
- php - 尝试通过 ActiveCampain API (Laravel) 添加联系人
- php - laravel 中的 PDO 在返回后不会进入下一个循环
- python - Python 到 VB.NET - 使用 Tor 检查 URL
- laravel - Lighthouse 根据其他属性值更改字段值
- powerapps - 从填充了来自共享点的项目的组合框中提取数据
- python - 如何将 django 模型保存到数据库?save() 方法不起作用
- haskell - 使用“Haskell Tool Stack”在哪里准确设置要导入的模块的依赖项?
- c# - Web 服务证书和 Windows 证书存储