Group By の前の MySQL の順序
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 以外のデータベースの場合):
In 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 で GROUP BY 句の後に ORDER BY 句が適用されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。