ホームページ  >  記事  >  データベース  >  分析関数を使用せずに MySQL の各カテゴリから上位 3 行を取得するにはどうすればよいですか?

分析関数を使用せずに MySQL の各カテゴリから上位 3 行を取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-30 10:34:27801ブラウズ

How to Get the Top 3 Rows From Each Category in MySQL Without Analytic Functions?

MySql の各カテゴリから上位 3 行を選択する

多数のレコードとカテゴリ列を持つテーブルで、次のタスクを取得するタスクが発生します。各カテゴリの上位 2 つの記事のみ。これを実現するために、ユーザーは最初に、取得する行数をカテゴリごとに 2 行に制限するビュー limitrows の作成を試みます。ただし、このアプローチでは不十分であることがわかります。

分析関数を理解する

望ましい結果を得るには、分析/ウィンドウ関数/ランキング関数を使用する必要があります。 MySQL が本質的にサポートしていないこれらの関数は、変数を使用して近似できます。

分析関数のエミュレート

次のコードは分析関数をエミュレートします。

SELECT x.*
FROM (SELECT t.*,
               CASE 
                 WHEN @category != t.category THEN @rownum := 1 
                 ELSE @rownum := @rownum + 1 
               END AS rank,
               @category := t.category AS var_category
          FROM TBL_ARTIKUJT t
          JOIN (SELECT @rownum := NULL, @category := '') r
      ORDER BY t.category) x
WHERE x.rank <= 3

変数 @rownum と @category は、それぞれ行番号と現在のカテゴリを追跡するために使用されます。これらの変数を使用することにより、カテゴリ内の各行のランクが決定され、上位 3 ランク内の行が選択されます。

結果セットのカスタマイズ

必要な列のみが返される場合は、以下に示すように SELECT ステートメントで必要な列を指定します。

SELECT x.articleid, x.title
FROM (SELECT t.*,
               CASE 
                 WHEN @category != t.category THEN @rownum := 1 
                 ELSE @rownum := @rownum + 1 
               END AS rank,
               @category := t.category AS var_category
          FROM TBL_ARTIKUJT t
          JOIN (SELECT @rownum := NULL, @category := '') r
      ORDER BY t.category) x
WHERE x.rank <= 3

以上が分析関数を使用せずに MySQL の各カテゴリから上位 3 行を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。