mysql - MYSQL 选择 DISTINCT 聊天对话
问题描述
我试图通过最新消息在 2 个用户之间进行不同的对话。我迷路了。
我的桌子是这样设置的
iD | From | to | Message | Read | Created_at
1 | 2 | 1 | blah1 | 0 | 2019-01-11 02:15:24
2 | 1 | 2 | blah2 | 0 | 2019-01-11 02:16:24
3 | 2 | 1 | blah3 | 0 | 2019-01-11 02:17:24
4 | 2 | 3 | blah4 | 0 | 2019-01-11 02:18:24
5 | 1 | 5 | blah5 | 0 | 2019-01-11 02:19:24
6 | 1 | 3 | blah6 | 0 | 2019-01-11 02:20:24
我想要每个对话的结果,没有重复。
所以,例如。如果选择用户 ID 为 1 的所有对话。我需要这样的结果...
iD | From | to | Message | Read | Created_at
3 | 2 | 1 | blah3 | 0 | 2019-01-11 02:17:24
5 | 1 | 5 | blah5 | 0 | 2019-01-11 02:19:24
6 | 1 | 3 | blah6 | 0 | 2019-01-11 02:20:24
我所做的一切都导致重复 1 对 2 和 2 对 1 的对话
我在这里搜索的所有内容都对我不起作用。
解决方案
您可以获取给定用户(在我的示例中我使用用户 1)和使用此查询的任何其他用户之间的最新对话时间:
SELECT CASE WHEN `From` = 1 THEN `To` ELSE `From` END AS other, MAX(Created_at) AS latest
FROM conversations
WHERE `From` = 1 OR `To` = 1
GROUP BY other
那么就只是JOIN
对整个表进行 ing 的问题,以获取两个用户之间最新消息的详细信息:
SELECT c.*
FROM conversations c
JOIN (SELECT CASE WHEN `From` = 1 THEN `To` ELSE `From` END AS other, MAX(Created_at) AS latest
FROM conversations
WHERE `From` = 1 OR `To` = 1
GROUP BY other) m
ON (c.From = 1 AND c.To = m.other OR c.To = 1 AND c.From = m.other) AND c.Created_at = m.latest
输出:
iD From to Message Read Created_at
3 2 1 blah3 0 2019-01-11 02:17:24
5 1 5 blah5 0 2019-01-11 02:19:24
6 1 3 blah6 0 2019-01-11 02:20:24
推荐阅读
- c# - .NET Forms 身份验证 - 保护具有混合内容的旧站点
- laravel - 使用 Vue js 在 Laravel Blade 中动态添加行
- alfresco - 为什么在 .parallel() 期间出现 MyBatisSystemException。在 Alfresco 6.2 中执行?
- python - 如何通过 nginx 在 Django 中提供生成的文件作为下载?
- python - 如何加快for循环?
- flutter - 颤振launch_background.xml中无法识别位图
- python - 如何在 Python 中将单行 DataFrame 转换为字符串?
- python-3.x - Python Pymem 出现很多错误
- css - 纯粹使用 CSS 给定宽高比的信箱内容
- c# - 如何在 C# 中使用正则表达式从具有特定属性和值的 HTML 标记中提取数据