mysql - 不使用多个sql语句的情况下使用order by条件进行分组

标签 mysql sql logic

表结构

 id
 user_id_1
 user_id_2
 message
 create_date

示例数据

 1 - 1 - 2 - "lorem ipsum" - 05.20.2016 15:12:11
 2 - 2 - 1 - "lorem ipsum dolor" - 05.20.2016 15:12:12
 3 - 3 - 1 - "lorem ipsum dolor sit" - 05.20.2016 15:12:13
 4 - 1 - 2 - "lorem ipsum dolor sit amet" - 05.20.2016 15:12:14

我有一个用于消息传递的表。我想列出用户(id:1)的消息列表。我在下面使用sql语句。

SELECT * FROM messages 
WHERE (`user_id_1` = 1 OR `user_id_2` = 1)
GROUP BY IF(`user_id_1`=1,`user_id_2`,`user_id_1`)
ORDER BY create_date DESC

通过使用group by,我只能让每个用户获得一次,但问题是使用第一行的GROUP BY。例如,对于 user_id_1: 1 我想获取 id:4 但它显示 id:1

摘要:任务是列出用户与最后一条消息的对话。有没有一种方法可以只用一个 SQL 语句来做到这一点,而不使用 "SELECT * FROM (SELECT * FROM ... ORDER BY) GROUP BY" 方式。

谢谢。

最佳答案

不要将GROUP BYSELECT *一起使用。这是一种 SQL 反模式,大多数数据库都不支持。

相反,使用过滤来获取所需的行。这是一种方法:

select m.*
from messages m
where 1 in (m.user_id_1, m.user_id_2) and
      m.create_date = (select max(m2.create_date)
                       from messages m2
                       where m2.user_id_1 = m.user_id2 or
                             m2.user_id_2 = m.user_id1
                      );

关于mysql - 不使用多个sql语句的情况下使用order by条件进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42113213/

相关文章:

mysql - COUNT 与 IF FROM DISTINCT 值 MySQL

javascript - (this) 在这段代码中如何工作,javascript?

php - Datepicker无法保存到MySQL

mysql - 如何防止mySQL重置自动增量值?

sql - 我的 sql 语句的 WHERE 语法不正确

mySQL,用新值替换第 n 个值

mysql - 在 MYSQL 中为 'nearest neighbor' 搜索实现 k-d 树?

c++ - 请给我一个 boost-multi-index stub - 带有 std::cout

logic - 为计算机科学家正式证明下限和上限函数

mysql - 创建具有相对日期的 MYSQL 查询