MySQL - 获取发送最新消息的用户

时间:2016-03-18 17:55:41

标签: mysql sql database

我有一个消息表如下:

group_messages table

基本上我想要的是,我想获取将最新消息发送给组的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;

只需从已经排序的列表中进行选择。

1 个答案:

答案 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;

在子查询中排序是不好的,因为它们会使查询变慢,在你的情况下,你在整个表上运行它。

查看Retrieving the last record in each group