如何使用MYSQL Group By和Order By Together

时间:2018-05-26 10:31:09

标签: mysql

我必须从按一列分组的表中获取数据,然后按另一列排序。 通常,当您在表上执行GROUP BY时,它将检索该组中的第一行。但我的任务是获得该组的最后一行。

我正在举例说明WordPress的帖子表的例子。考虑一下,我们需要从wp_posts表中获取数据,这些表由post_type字段分组,并按ID的顺序递减。 在第一次尝试时,我运行了如下的查询。

SELECT ID, post_type FROM wp_posts GROUP BY post_type ORDER BY ID DESC;

我认为这是正确的,但事实并非如此。请查看下面的图片,查看我使用此查询收到的数据。

Id  | post_type................................................................................................
65  | attachment........................................................................................
2   | nav_menu_item.......................................................................................
187 | page ........................................................................................................
1897| post.......................................................................................................

我也尝试过一些谷歌搜索后,但有些功能对我不起作用

SELECT subtable.ID, subtable.post_type FROM 
(SELECT * FROM wp_posts ORDER BY ID DESC) AS subtable 
GROUP BY post_type

我想要的结果就是这个

Id  | post_type.................................................................................................
1900| attachment..................................................................................
1672| nav_menu_item.................................................................................
1668| page...............................................................................................
1899| post..................................................................................................

我认为问题是使用GROUP BY时通过排序来恢复顺序的时态表。

1 个答案:

答案 0 :(得分:0)

您应该使用:

SELECT *
FROM messages m1
WHERE message_id = (SELECT message_id
                     FROM messages m2
                     WHERE m1.user_id = m2.user_id
                     ORDER BY created_at DESC
                     LIMIT 1);

或者如果你有MySQL 8.0简单ROW_NUMBER

SELECT *
FROM (SELECT *
            ,ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY created_at DESC) rn
      FROM messages) sub
WHERE sub.rn = 1