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中文網其他相關文章!