序文: 一部のアプリケーション シナリオでは、成績や年齢によるランキングなど、ランキングの問題が発生することがよくあります。直接ランキング、グループランキング、間隔付きランキング、間隔なしランキングなど、ランキングの方法は多数あります。この記事では、MySQL における一般的なランキングの問題をいくつかまとめます。 テストテーブルを作成する テーブルscores_tbを作成する( id int auto_increment 主キー、 xuehao int が null ではない、 スコア int が null でない )ENGINE=InnoDB デフォルト文字セット=utf8; scores_tb (xuehao,score) に値 (1001,89),(1002,99),(1003,96),(1004,96),(1005,92),(1006,90),(1007,90),(1008,94) を挿入します。 # 挿入されたデータを表示しますmysql> select * from scores_tb; +----+--------+-------+ | id | xuehao | スコア | +----+--------+-------+ | 1 | 1001 | 89 | | 2 | 1002 | 99 | | 3 | 1003 | 96 | | 4 | 1004 | 96 | | 5 | 1005 | 92 | | 6 | 1006 | 90 | | 7 | 1007 | 90 | | 8 | 1008 | 94 | +----+--------+-------+ 1. 普通順位 行番号と同様に、スコアによって直接ランク付けします。1 から始まり、下に向かっていきます。以下にクエリステートメントとランキング結果を示します。 # クエリステートメント SELECT xuehao, score, @curRank := @curRank + 1 AS rank scores_tb から、( @curRank := 0 を選択 ) スコア降順で並べ替え; # 結果の並べ替え +--------+-------+------+ | xuehao | スコア | 順位 | +--------+-------+------+ | 1002 | 99 | 1 | | 1003 | 96 | 2 | | 1004 | 96 | 3 | | 1008 | 94 | 4 | | 1005 | 92 | 5 | | 1006 | 90 | 6 | | 1007 | 90 | 7 | | 1001 | 89 | 8 | +--------+-------+------+ 上記のクエリ ステートメントでは、変数 @curRank を宣言し、0 に初期化します。行が見つかったら、変数を 1 増やし、それをランキングとして使用します。このタイプのランキングには差がなく、スコアは同じでもランキングが異なるものがあることがわかります。 2. スコアは同じ、順位も同じ、順位に差はない # クエリステートメント SELECT xuehao, score, 場合 @prevRank = スコアの場合、@curRank @prevRank := スコアの場合、@curRank := @curRank + 1 END ASランク scores_tbより、 (@curRank := 0、@prevRank := NULL を選択) スコア降順で並べ替え; # ランキング結果+--------+-------+------+ | xuehao | スコア | 順位 | +--------+-------+------+ | 1002 | 99 | 1 | | 1003 | 96 | 2 | | 1004 | 96 | 2 | | 1008 | 94 | 3 | | 1005 | 92 | 4 | | 1006 | 90 | 5 | | 1007 | 90 | 5 | | 1001 | 89 | 6 | +--------+-------+------+ 3. 順位は同点、順位に差あり 別のランキング方法は、同じ値には同じランキングがあり、同じ値の次のランクはジャンプする整数値である必要がある、つまり、ランキングにギャップがあるというものです。 # クエリステートメント SELECT xuehao, score, rank FROM (選択 xuehao、スコア、 @curRank := IF(@prevRank = スコア、@curRank、@incRank) AS ランク、 @incRank := @incRank + 1、 @prevRank := スコア scores_tb から、( @curRank := 0、@prevRank := NULL、@incRank := 1 を選択 ) ORDER BY スコア desc) s; # ランキング結果+--------+-------+------+ | xuehao | スコア | 順位 | +--------+-------+------+ | 1002 | 99 | 1 | | 1003 | 96 | 2 | | 1004 | 96 | 2 | | 1008 | 94 | 4 | | 1005 | 92 | 5 | | 1006 | 90 | 6 | | 1007 | 90 | 6 | | 1001 | 89 | 8 | +--------+-------+------+ 上記で紹介した 3 つのランキング方法は、実装が比較的複雑です。幸いなことに、MySQL 8.0 ではウィンドウ関数が追加され、組み込み関数を使用して上記のランキングを簡単に実現できます。 MySQL 8.0はウィンドウ関数を使用してランキングを実装します MySQL 8.0 では、ROW_NUMBER()、DENSE_RANK()、RANK() の 3 つのウィンドウ関数を使用して、上記の 3 つのランキングを実装できます。注意すべき点は、as の後のエイリアスは前の関数名と同じであってはならないということです。同じでない場合、エラーが報告されます。以下は、ランキングを実装するこれらの 3 つの関数の例です。 # 上記の 3 つのランキングに対する 3 つのステートメント select xuehao,score, ROW_NUMBER() OVER(order by score desc) as row_r from scores_tb; scores_tb から、xuehao、スコア、DENSE_RANK() OVER(スコア降順) を concentration_r として選択します。 scores_tb から xuehao,score, RANK() over(order by score desc) as r を選択します。 # 1つのステートメントで異なるランキングを照会することもできます SELECT xuehao,score, ROW_NUMBER() OVER w AS 'row_r'、 DENSE_RANK() OVER w AS 'dense_r'、 RANK() OVER w AS 'r' `scores_tb` から WINDOW w AS (ORDER BY `score` desc); # ランキング結果+--------+-------+-------+---------+---+ | xuehao | スコア | row_r | dense_r | r | +--------+-------+-------+--------+---+ | 1002 | 99 | 1 | 1 | 1 | | 1003 | 96 | 2 | 2 | 2 | | 1004 | 96 | 3 | 2 | 2 | | 1008 | 94 | 4 | 3 | 4 | | 1005 | 92 | 5 | 4 | 5 | | 1006 | 90 | 6 | 5 | 6 | | 1007 | 90 | 7 | 5 | 6 | | 1001 | 89 | 8 | 6 | 8 | +--------+-------+-------+--------+---+ 要約: この記事では、3 つの異なるシナリオで統計ランキングを実装するための SQL ステートメントについて説明します。さまざまなビジネス ニーズに基づいて適切なランキング ソリューションを選択できます。 MySQL 8.0 と比較すると、ウィンドウ関数を使用するとランキングがより簡単になります。実際、ビジネス要件はここで示した例よりもはるかに複雑です。SQL を使用してこのようなビジネス要件を実装するには、経験を積むのにまだ時間がかかります。 上記は、MySQL におけるいくつかの一般的なランキングの問題の詳細な要約です。MySQL ランキングの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
>>: Vueユーザーが長時間操作せずにログインページからログアウトするように実装する2つの方法
目次1. DOM の違い2. 同じレイヤーの同じタイプの要素にキー属性を追加する3. キーはインデッ...
目次序文グローバルパラメータの永続性最後に要約する参考資料:序文2018 年に MySQL 8.0....
Mysql Workbench はオープンソースのデータベース クライアントです。このオープンソース...
方法1: var a = [1,2,3]; var b = [4,5] b を連結します。 コンソー...
1. nginx-1.8.1.tar.gzを解凍する2. fastdfs-nginx-module-...
設定が有効にならない場合が多いため、幅や高さなどをテーブル内で直接設定しないことをお勧めします。スタ...
序文MRR は Multi-Range Read の略で、ランダム ディスク アクセスを削減し、ラン...
MySQL 認証コマンド grant の使用方法:この記事の例は MySQL 5.0 以降で実行され...
赤とピンク、およびそれらの 16 進コード。 #990033 #CC6699 #FF6699 #FF...
今日、クライアントが広告を掲載したいのですが、提供された素材は Flash です。私たちはあまり気に...
<br />友人と話し合っていたとき、フレームワークのレイヤー設計の中で最も核となるのは...
text-fill-color とは何を意味しますか?文字通りの意味から言えば、「テキストの塗りつぶ...
この記事では主に、次のように共有されるネイティブ JS 音楽プレーヤーのサンプル コードを紹介します...
この記事の例では、ログインと登録の効果を実現するためのvueプロジェクトの具体的なコードを共有してい...
目次Matlab セントロイドアルゴリズムMatlab はクローズドな商用ソフトウェアであり、米国政...