我必须从按一列分组的表中获取数据,然后按另一列排序。 通常,当您在表上执行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时通过排序来恢复顺序的时态表。
答案 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