表结构
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 BY
与SELECT *
一起使用。这是一种 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/