我有一个消息表如下:
基本上我想要的是,我想获取将最新消息发送给组的n
个用户。因此,必须按from_user_id
进行分组,并按id
降序排序。我有以下查询:
SELECT `users`.`id` AS `user_id`, `users`.`username`, `users`.`image`
FROM `group_messages`
JOIN `users` ON `users`.`id` = `group_messages`.`from_user_id`
WHERE `group_messages`.`to_group_id` = 31
GROUP BY `users`.`id`
ORDER BY `group_messages`.`id` DESC;
问题是,当我按user.id
分组时,会考虑具有最小id
字段的行。因此,我得到的不是id
正在下降的顺序。
那么有没有办法分组,考虑最大的id
?或者我应该以另一种方式接近它?
提前致谢。
编辑:我想我明白了。
SELECT `x`.`id`, `users`.`id` AS `user_id`, `users`.`username`, `users`.`image`
FROM (SELECT * FROM `group_messages` ORDER BY `group_messages`.`id` DESC) `x`
JOIN `users` ON `users`.`id` = `x`.`from_user_id`
WHERE `x`.`to_group_id` = 31
GROUP BY `users`.`id`
ORDER BY `x`.`id` DESC;
只需从已经排序的列表中进行选择。
答案 0 :(得分:0)
在子查询中使用order不是一种非常有效的方法。试试这个:
users table
| uid | name | ---------- |
messages table
|id | from_uid | to_group_id | ----------- |
SELECT u.* FROM users as u JOIN (
SELECT g1.*
FROM messages g1 LEFT JOIN messages g2
ON g1.from_uid = g2.from_uid AND g1.to_groupid = g2.to_groupid
AND g1.id<g2.id
WHERE g2.id is NULL) as lastmessage
ON lastmessage.from_uid = u.uid
WHERE lastmessage.to_groupid = 1
ORDER BY lastmessage.id DESC;
在子查询中排序是不好的,因为它们会使查询变慢,在你的情况下,你在整个表上运行它。