MySQL:在 Group By 之前对结果进行排序
在 MySQL 中对结果进行分组时,了解操作顺序非常重要。默认情况下,MySQL 会对分组后的结果进行排序,这在某些情况下可能不是所需的行为。
原始查询和限制
考虑以下内容查询:
SELECT wp_posts.* FROM wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' GROUP BY wp_posts.post_author ORDER BY wp_posts.post_date DESC
此查询正确地对结果进行分组,以仅显示每个作者的最新帖子。但是,结果是在分组之后排序的,因此最新的帖子不一定位于列表的开头。
使用 HAVING 的解决方案
对结果进行排序在分组之前,我们可以使用 HAVING 子句:
SELECT wp_posts.* FROM wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' GROUP BY wp_posts.post_author HAVING wp_posts.post_date = MAX(wp_posts.post_date) ORDER BY wp_posts.post_date DESC
HAVING 子句对分组后的结果进行过滤,确保仅返回每个作者具有最大 post_date 的行。这保证了最新的帖子显示在列表的开头。
其他数据库的替代解决方案
如果使用不支持 HAVING 子句的数据库 (例如 Postgres 或 SQL Server),另一种解决方案是将原始表与子查询连接起来,该子查询计算每个表的最大 post_date作者:
SELECT wp_posts.* FROM wp_posts JOIN ( SELECT g.post_author MAX(g.post_date) AS post_date FROM wp_posts as g WHERE g.post_status='publish' AND g.post_type='post' GROUP BY g.post_author ) as t ON wp_posts.post_author = t.post_author AND wp_posts.post_date = t.post_date ORDER BY wp_posts.post_date
以上是如何在分组前对 MySQL 结果进行排序?的详细内容。更多信息请关注PHP中文网其他相关文章!