ホームページ > データベース > mysql チュートリアル > 分析関数を使用せずに、MySQL テーブルの各カテゴリから上位 3 行を選択する方法は?

分析関数を使用せずに、MySQL テーブルの各カテゴリから上位 3 行を選択する方法は?

Linda Hamilton
リリース: 2024-10-29 14:58:02
オリジナル
470 人が閲覧しました

How to Select the Top 3 Rows from Each Category in a MySQL Table Without Using Analytic Functions?

MySQL クエリ: テーブル内の各カテゴリから上位 3 行を選択する

このシナリオでは、多数のレコードを含むテーブルがあります。カテゴリごとに分類されています。目標は、各カテゴリから上位 3 つの記事のみを取得することです。ビューと LIMIT を使用して解決策を試みましたが、レコード数が制限されました。

この課題に対処するには、MySQL にはない分析関数を利用する必要があります。ただし、次の変数を使用しても同様の効果を実現できます。

<code class="sql">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</code>
ログイン後にコピー

このクエリは、変数 @rownum と @category を使用して、カテゴリ内の行ランキングを追跡します。まず、両方の変数を NULL/空の値に設定します。

テーブル内の各行 (「t」というエイリアス) について、現在のカテゴリが前のカテゴリと異なるかどうかを確認します。存在する場合は、@rownum に 1 を割り当てます。それ以外の場合は、@rownum を 1 ずつ増やします。同時に、現在のカテゴリを @category に割り当て、後続の行での比較のコンテキストを維持します。

その結果、カテゴリ内の各行をランク付けする一時テーブルが作成されます。最後の WHERE 句は、この一時テーブルをフィルタリングして、ランク 3 以下の行のみを表示します。

必要な列と一致するように、外側の SELECT 句 (x.*) の列参照を調整することを忘れないでください。取得します。

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

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