ホームページ > データベース > mysql チュートリアル > 単一の SQL クエリでカテゴリごとに 4 つの最新アイテムを取得するにはどうすればよいですか?

単一の SQL クエリでカテゴリごとに 4 つの最新アイテムを取得するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-22 01:57:09
オリジナル
136 人が閲覧しました

How to Retrieve the Four Newest Items Per Category with a Single SQL Query?

単一のクエリを使用して各カテゴリの最新アイテムを選択します

category_id という名前のフィールドによって分類されたアイテムのデータベースで、タスクはカテゴリのリストを取得することです。各カテゴリには、最近リストされた 4 つのアイテムが含まれています。カテゴリごとにデータベースに個別にクエリを実行するのではなく、単一の SQL クエリを使用してデータベース呼び出しを最適化します。

外部結合を使用したソリューション:

次のクエリは、外部結合を使用して、同じカテゴリ内で対応する更新されたアイテムを識別して除外します。

<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.category_id, i1.item_id
HAVING COUNT(*) <= 4;</code>
ログイン後にコピー

このクエリは、LEFT OUTER JOIN を使用して、各アイテム (i1) を、同じカテゴリを持つ更新されたアイテムのセット (i2) と結合します。 COUNT(*) 各カテゴリの各アイテムの一致数をカウントするために使用されます。 HAVING 句は、一致する項目が 5 つ以上ある項目をフィルターで除外し、各カテゴリで最新の 4 つの項目のみが選択されるようにします。

MySQL ユーザー変数を使用したソリューション:

このソリューションは、MySQL のユーザー変数機能を利用してグループ番号と行番号を追跡します。

<code class="language-sql">SELECT *
FROM (
    SELECT i.*, @r := IF(@g = category_id, @r+1, 1) AS rownum, @g := category_id
    FROM (SELECT @g:=null, @r:=0) AS _init
    CROSS JOIN item i
    ORDER BY i.category_id, date_listed DESC
) AS t
WHERE t.rownum <= 4;</code>
ログイン後にコピー

このクエリでは、ユーザー定義変数 @g@r を使用して現在のカテゴリと行番号を追跡し、各カテゴリの最初の 4 つの項目のみが選択されるようにします。

MySQL ウィンドウ関数を使用したソリューション (MySQL 8.0.3):

MySQL 8.0.3 では SQL 標準ウィンドウ関数のサポートが導入され、より簡潔で効率的なソリューションが提供されます。

<code class="language-sql">WITH numbered_item AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY date_listed DESC) AS rownum
  FROM item
)
SELECT * FROM numbered_item WHERE rownum <= 4;</code>
ログイン後にコピー

このクエリは、PARTITION BY category_id ORDER BY date_listed DESC 句を使用して結果セットをカテゴリごとに分割し、各パーティションの date_listed 列によって項目を降順に並べ替えます。次に、ROW_NUMBER() ウィンドウ関数は各パーティションに連続した行番号を割り当て、各カテゴリの最初の 4 つの項目を選択できるようにします。

以上が単一の SQL クエリでカテゴリごとに 4 つの最新アイテムを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート