MySQL Order 先於Group By
在MySQL 中,執行同時涉及ORDER BY 和GROUP BY 子句的查詢時,需要注意ORDER BY 子句在GROUP BY 子句之後套用。這意味著結果首先分組然後排序,這可能不是所需的行為。
問題:
考慮以下查詢:
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
此查詢旨在檢索每個作者的最新帖子並按作者對結果進行分組。但是,ORDER BY 子句在 GROUP BY 子句之後套用,導致結果在分組後進行排序。
解決方案:
解決此問題問題,可以修改查詢以在分組之前執行排序:
SELECT wp_posts.* FROM wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' ORDER BY wp_posts.post_date DESC GROUP BY wp_posts.post_author
此修改後的查詢首先按發布日期按降序對結果進行排序,然後再按作者分組。結果是,將檢索每個作者的最新貼文並將其放置在結果集中的第一個位置。
替代解決方案(對於非MySQL 資料庫):
中對於不支援分組前排序的資料庫,例如SQL Server 和PostgreSQL,可以採用替代解決方案:
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
此查詢使用子查詢來識別每個作者的最大發布日期,然後加入此查詢結果集與主wp_posts表一起檢索實際的貼文資料。請注意,此解決方案可能會為同一日期有多個帖子的作者返回多行,因此根據特定要求,可能需要進行額外的過濾。
以上是為什麼 MySQL 中 ORDER BY 子句應用在 GROUP BY 子句之後?的詳細內容。更多資訊請關注PHP中文網其他相關文章!