さまざまなカテゴリから最新のアイテムを取得する単一の SQL クエリ
この記事では、単一のデータベース クエリを使用して複数のカテゴリにわたって最新のアイテムを取得し、データベース呼び出しを最小限に抑えるための効率的な SQL ソリューションを紹介します。
SQL ソリューション: 外部結合の活用
「グループごとの最大 n 個」問題は、外部結合を使用してエレガントに解決されます。
<code class="language-sql">SELECT i1.* FROM item i1 LEFT OUTER JOIN item i2 ON (i1.category_id = i2.category_id AND i1.item_id < i2.item_id) GROUP BY i1.item_id HAVING COUNT(i2.item_id) < 4;</code>
このクエリは、それぞれのカテゴリ内で新しいアイテムが 4 つ未満のアイテムを効率的に選択します。
説明:
クエリは、各項目 (i1
) を、同じカテゴリ内でより高い i2
を持つ (新しいものであることを意味する) 他の項目 (item_id
) と結合します。 HAVING
句は、3 つ以上の新しいアイテムを含むアイテムをフィルターで除外し、カテゴリごとに最新の 4 つのアイテムのみを残します。
利点:
代替アプローチ:
この方法では、MySQL のユーザー定義変数を使用して行番号を割り当て、カテゴリごとに 4 つの最新のアイテムを識別します。 (このアプローチは外部結合方法よりも移植性が低くなります)。
MySQL 8.0.3 は標準 SQL ウィンドウ関数をサポートし、より簡潔なソリューションを提供します。
<code class="language-sql">WITH numbered_item AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY item_id DESC) AS rownum FROM item ) SELECT * FROM numbered_item WHERE rownum <= 4;</code>
このアプローチでは、アイテムをカテゴリごとにパーティション化し、item_id
に基づいて行番号を割り当て (新しいものから降順)、各パーティションから上位 4 行を選択します。
以上が単一の SQL クエリを使用して複数のカテゴリから最新のアイテムを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。