MySQLでorder byを使用せずにランキングを実装する3つの方法のまとめ

MySQLでorder byを使用せずにランキングを実装する3つの方法のまとめ

ビジネスを想定:

2位の従業員の給与情報を見る

データベースを作成する

emps が存在する場合はデータベースを削除します。
データベースempsを作成します。
emps を使用します。

従業員テーブルを作成する(
    empId int 主キー、 -- 従業員番号 性別 char(1) NOT NULL、 -- 従業員の性別 hire_date date NOT NULL -- 従業員の入社日 );
給与表を作成する(
    empId int 主キー、 
    給与の2倍 -- 従業員の給与);
    
従業員に値(10001、'M'、'1986-06-26')を挿入します。
従業員にVALUES(10002,'F','1985-11-21')を挿入します。
従業員にVALUES(10003,'M','1986-08-28')を挿入します。
従業員にVALUES(10004,'M','1986-12-01')を挿入します。
給与に値(10001,88958)を挿入します。
給与に値(10002,72527)を挿入します。
給与に値(10003,43311)を挿入します。
給与に値(10004,74057)を挿入します。

解決

1. (基本的な解決策)

まず給与表から最高給与を探し、それを条件として2番目に高い給与を探します。

クエリステートメントは次のとおりです。

選択
	E.empId、E.gender、E.hire_date、S.salary
から
	従業員Eが給与Sに加入 
の上 
	E.empId = S.empId
どこ	
	S.給料=
	(
    給与からmax(給与)を選択 
    どこ 
        給料
        (給与から最大(給与)を選択)
    );
-- ---------------クエリ結果------------- --
+-------+---------+-----------+---------+
| 従業員ID | 性別 | 入社日 | 給与 |
+-------+---------+-----------+---------+
| 10004 | 男性 | 1986-12-01 | 74057 |
+-------+---------+-----------+---------+

2. (自己結合クエリ)

まず、給与に関する自己結合クエリを実行します。s1<=s2 が s1.salary によってリンクされグループ化されている場合、count の値、つまり彼よりも給与が高い人の数は、count=2 の人を選択して 2 番目に高い給与を取得することでフィルタリングできます。

クエリステートメントは次のとおりです。

選択
	E.empId、E.gender、E.hire_date、S.salary
から
	従業員Eが給与Sに加入 
の上 
	E.empId = S.empId
ここでS.給与=
	(
    選択 
        s1.給与
    から 
        給与 s1 給与 s2 に参加 
    の上 
        s1.給与 <= s2.給与
    グループ化 
        s1.給与              
  	持つ
  	 count(個別のs2.salary) = 2
    );
-- ---------------クエリ結果------------- --
+-------+---------+-----------+---------+
| 従業員ID | 性別 | 入社日 | 給与 |
+-------+---------+-----------+---------+
| 10004 | 男性 | 1986-12-01 | 74057 |
+-------+---------+-----------+---------+

3. (自己結合クエリ最適化バージョン)

原理は2と同じですが、コードははるかに簡単です。上記の2つの方法は、最後の方法を導入するためのものです。多くの場合、group byとorder byには制限があります。初心者にとって、このより実用的なアイデアを習得することは依然として意味があります。

選択
	E.empId、E.gender、E.hire_date、S.salary
から
	従業員Eが給与Sに加入 
の上
    S.empId =E.empId
どこ
    (給与>=S.salaryの給与からcount(1)を選択)=2;
-- ---------------クエリ結果------------- --
+-------+---------+-----------+---------+
| 従業員ID | 性別 | 入社日 | 給与 |
+-------+---------+-----------+---------+
| 10004 | 男性 | 1986-12-01 | 74057 |
+-------+---------+-----------+---------+

あくまでも簡単な要約ですので、間違いがありましたらご指摘ください。

要約する

これで、order by を使用せずに MySQL でランキングを実装する 3 つの方法についての記事は終了です。order by を使用しない MySQL ランキングに関する関連コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySql ページングで limit+order by を使用する場合のデータ重複の解決策
  • MySQLサブクエリでorder byが効かない問題の解決方法
  • MySQLのorder byとlimitを混在させる際の落とし穴の詳細な説明
  • MySQL の group by と order by を一緒に使用する方法
  • インデックスを使用して MySQL ORDER BY ステートメントを最適化する方法
  • MySQL のソートとページング (order by と limit) と既存の落とし穴
  • MySQLにおける(JOIN/ORDER BY)文のクエリ処理と最適化方法
  • MySQLは「order by」がどのように機能するかを簡単に理解します
  • MySQL の order by ステートメントの最適化方法の詳細な説明
  • MySQL での order by の使用に関する詳細

<<:  CSS3 のテキストとフォントの新しい設定

>>:  ウェブサイト製品設計の参考となるいくつかの原則

推薦する

Windows10システムにMySQL 5.7.17をインストールする

オペレーティング システム win10 MySQL は、公式 Web サイトからダウンロードした 6...

Spring Boot 2.4 の新機能、ワンクリックビルド、Docker イメージプロセスの詳細説明

背景開発プロセス中に Docker コンテナ化をサポートするために、通常は Maven を使用してコ...

Linux コマンドラインでメールを送信する 5 つの方法 (推奨)

シェル スクリプトで電子メールを作成する必要がある場合は、コマンド ラインから電子メールを送信する知...

jsは双方向データバインディング(アクセサ監視)を実現します

この記事の例では、双方向データバインディングを実現するためのjsの具体的なコードを参考までに共有して...

CentOS7環境でDockerを使ってPHP動作環境を構築する手順を詳しく解説

関連記事: CentOS7でyumを使用してDockerをインストールするDockerを使ってWin...

見落とされがちなMETAタグの特殊効果(ページ遷移効果)

Web デザインで js を使用すると、多くのページ効果を実現できますが、HTML タグの META...

トップ 10 Js 画像処理ライブラリ

目次導入1. 異食症2. レナ3. コンプレッサー4. ファブリック5. ぼかす6. 画像を結合する...

MySQL の 6 つの一般的な制約タイプの詳細な説明

目次序文1.nullでない2. ユニーク3. デフォルト4.主キー自動増分主キー5. 外部キー6.チ...

HTML5+CSS3 ヘッダー作成例と更新

前回、私たちは 2 つのヘッダー レイアウト (フレックスボックス 1 つとフロート 1 つ) を考...

MySQL ジョイントテーブルクエリの簡単な例

MySql は結合テーブルクエリを使用しますが、初心者には理解しにくい場合があります。以下の記事では...

Tencent Cloud 上で Hadoop 3.x 疑似クラスターを構築する方法を説明します

1. 環境整備CentOS Linux リリース 7.5.1804 (コア)インストールフォルダを作...

Ubuntu16.04はphp5.6ウェブサーバー環境を構築します

Ubuntu 16.04 はデフォルトで PHP7.0 環境をインストールしますが、PHP7 は一部...

1 行または複数行のテキストがオーバーフローしたときに省略記号を表示する CSS を実装する方法

1. 単一行オーバーフロー1. 1 行がオーバーフローした場合、超過部分は表示されます...または、...

jsはポップアップウィンドウをクリックすることでポップアップログインボックスを実装します

この記事では、ポップアップウィンドウをクリックしたときにポップアップログインボックスを実現するための...

ウェブサイトの速度を上げる6つの方法

1. .js ライブラリ ファイルのアドレスを Google CDN アドレスに置き換えます。 (G...