在MySQL 中檢索每個作者的最新帖子:使用JOIN 而不是Order by Before Group By
當努力檢索每個作者的最新貼文時在資料庫中,作者在MySQL 中的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
雖然此查詢旨在按作者對帖子進行分組並傳回每個帖子的最新帖子,但當存在多個帖子時,它可能會失敗相同的post_date。在這種情況下,每個作者組內貼文返回的順序變得不可預測,從而導致結果不一致。
使用子查詢解決問題
建議的解決此問題的方法是使用子查詢,如下所示:
SELECT wp_posts.* FROM ( SELECT * FROM wp_posts ORDER BY wp_posts.post_date DESC ) AS wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' GROUP BY wp_posts.post_author
透過使用此子查詢,帖子首先按其順序排序post_date 按降序排列。然後,生成的子查詢表充當主查詢的來源,確保在分組之前將最新帖子放置在每個作者群組的頂部。
使用 JOIN 的替代方法
檢索每個作者最新帖子的另一種有效方法是利用 JOIN 操作。以下查詢示範了此方法:
SELECT p1.* FROM wp_posts p1 INNER JOIN ( SELECT max(post_date) MaxPostDate, post_author FROM wp_posts WHERE post_status='publish' AND post_type='post' GROUP BY post_author ) p2 ON p1.post_author = p2.post_author AND p1.post_date = p2.MaxPostDate WHERE p1.post_status='publish' AND p1.post_type='post' order by p1.post_date desc
此查詢涉及兩個步驟:
結論
雖然在分組之前使用子查詢對行進行排序可以是檢索每個作者最新帖子的有效解決方案,但它並不是唯一可用的方法。 JOIN 操作提供了一種既高效又產生可靠結果的替代方法。
以上是如何在MySQL中高效檢索每個作者的最新貼文?的詳細內容。更多資訊請關注PHP中文網其他相關文章!