MySQL で作成者ごとに最新の投稿を取得する: Order by Before Group By の代わりに JOIN を使用する
それぞれの最新の投稿を取得しようとする場合データベースの作成者にとって、MySQL で GROUP BY の前に ORDER BY 句を使用する最初のアプローチでは、望ましくない結果が生じることがよくあります。ただし、グループ化する前にサブクエリを使用して行を並べ替えることは、潜在的な解決策になる可能性があります。
Group By の前に Order 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 を使用した代替アプローチ
著者ごとに最新の投稿を取得するもう 1 つの効果的なアプローチは、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
このクエリには 2 つのステップが含まれます。
結論
グループ化する前にサブクエリを使用して行を並べ替えることは、著者ごとの最新の投稿を取得するための効果的な解決策ではありますが、唯一のアプローチが利用可能です。 JOIN 操作は、効率的で信頼性の高い結果を生成する代替方法を提供します。
以上がMySQL で各著者の最新の投稿を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。