MySQL のあまり知られていないソート方法

MySQL のあまり知られていないソート方法

序文

ORDER BY 字段名升序/降序、このソートステートメントは皆さんご存知だと思いますが、特殊なソートに遭遇した場合、フィールド名のみを使用してもニーズを満たすことはできません。私が遭遇したソート方法をいくつか紹介します。

1. 準備

より良いデモンストレーションと理解のために、まず学生テーブルを準備し、番号、名前、学年の 3 つのフィールドを追加し、図に示すようにいくつかのデータを挿入します。

2. 条件付きソート

要件1: スコアを高いものから低いものの順に並べる

路上で野菜を売っているおばさんでもノックできますし、 ORDER BY examScore DESCを使えば簡単に完了できます(下の左の図を参照)。

要件2: スコアの高いものから低いものの順に並べ、スコアのないものを先頭にします

顧客体験が最も重要です。スコアの 2 回目の入力を容易にするために、このようなリクエストを行うのは普通のことです。このソートを実現するには、上記のステートメントを実装することはできないため、条件付きソートが必要です。まず、スコアが空かどうかを判定し、最大値を割り当ててからソートします。たとえばORDER BY IF(examScore IS NULL,101,examScore) DESCも簡単に実装できます (下の右の図を参照)。

必要要件 1要件 2
声明試験スコアの降順で並べ替えORDER BY IF(examScore IS NULL,101,examScore) DESC
効果ここに画像の説明を挿入ここに画像の説明を挿入

3. カスタムソート

お客様は神様のような存在で、派手な要求をされることも珍しくありません。例えば、張三と李思を前に座らせ、他の生徒を成績順に上位から下位に並べるよう要求します。この場合、カスタムソートを使用する必要があります。MySQL に組み込まれている FIELD 関数 (対応する文字列のインデックスを返す) を使用すると、これを実現できます。

声明1:
ORDER BY FIELD(studentName,'张三','李四') ASC、examScore DESC;

上記のステートメントを実行した結果、張三と李四は最後になります (下の左の図を参照)。当然、張三と李四を先頭に配置して降順で並べ替える必要があります。

声明2:
ORDER BY FIELD(studentName,'李四','张三') DESC、examScore DESC;

結果はまさに彼が望んでいた通りでした (下の右の写真を参照)。

声明文1声明2
効果ここに画像の説明を挿入ここに画像の説明を挿入

その後、FIND_IN_SET 関数を使用してもこれを実現できることがわかり、100 万のデータ レコードでテストした結果、FIND_IN_SET の方がパフォーマンスが優れていることがわかりました。

ORDER BY FIND_IN_SET(studentName,'李四,张三') DESC, examScore DESC;

4. 漢字を頭文字で並べ替える

中国語の文字は一般的なORDER BY 字段ASCを使用して簡単に並べ替えることができるので、なぜあまり知られていないのかと不思議に思う友人もいるかもしれません。
実際、ユーザーが GBK 文字セットを使用してテーブル フィールドを作成する場合、 ORDER BY 字段ASC直接使用することで問題を解決できます。一部のユーザーは文字化けを防ぐために utf8 文字セットを使用しており、単純なソート ステートメントは無力です (下の左の図を参照)。したがって、ソート時にフィールドを GBK に変換しても問題ありません (下の右の図を参照)。

声明学生名 ASC で並べ替えORDER BY CONVERT(studentName USING GBK) ASC
効果ここに画像の説明を挿入ここに画像の説明を挿入

要約する

これで、MySQL のあまり知られていないソート方法についての記事は終了です。MySQL のソート方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL での utf8mb4 照合の例
  • MySQL 集計関数のソート
  • インデックススキャンを使用したMySQLソート
  • Mysql 中国語ソートルールの説明
  • MySQLのデフォルトのソートルールに基づく落とし穴
  • MySQL ソートの原則とケース分析
  • MySQLクエリのソートとページング関連
  • インデックスを使用して MySQL ORDER BY ステートメントを最適化する方法
  • MySQL のソートとページング (order by と limit) と既存の落とし穴
  • MySQL ソート機能の詳細

<<:  HTML Web ページにおける URL の表現

>>:  DockerコンテナはホストのMySQL操作にアクセスする

推薦する

ウェブサイトのユーザーエクスペリエンスデザイン(UE)

Google Reader で、JunChen が書いた「フロー理論と設計」というタイトルの投稿を見...

CSS3 を使用して中心点の周りに要素を配置する方法の例

この記事では、CSS3 を使用して中心点を中心に要素をレイアウトする方法の例を紹介します。詳細は次の...

MySQL 正規表現 (regexp と rlike) の検索機能の例分析

この記事では、例を使用して MySQL 正規表現 (regexp および rlike) の検索機能を...

Linuxプロセス監視と自動再起動の簡単な実装方法

目的: Linux では、さまざまな理由でサーバー プログラムがダンプされ、ユーザーの使用に影響する...

vue3を使用してAppleシステムのサイドメッセージプロンプト効果を模倣する

目次アニメーションプレビューその他のUIライブラリ始めるコンポーネントディレクトリ構造トーストおおよ...

CSSで制御可能な点線を実装する方法

序文CSS を使用して点線を生成するのは、フロントエンド開発者にとっては簡単です。一般的に、これを実...

Vue3コンポーネントの開発詳細

目次1. はじめに2. コンポーネント開発1. コンポーネントの構成2. ヘッダーコンポーネントの開...

Vue.js の watch メソッドと computed メソッドの違いの詳細な例

目次序文導入1. 作用機序2. 自然から3. 時計と計算の比較4. メソッドはデータロジックの関係を...

MySQL の削除に基づく構文エイリアスの問題

目次MySQL 削除構文エイリアスの問題mysql の delete ステートメントでエイリアスを使...

React における同期および非同期 setState の問題のコード分析

React は Facebook の社内プロジェクトとして始まりました。 React の出現は革命的...

MySQL 8.0.13 のダウンロードとインストールのチュートリアル(画像とテキスト付き)

MySQL は最もよく使用されるデータベースです。詳しく知るには、コンピュータにインストールする必...

MySQL のロックとトランザクションの簡単な分析

MySQL 自体はファイルシステムに基づいて開発されましたが、ロックの存在が異なります。データベース...

HTML テーブル マークアップ チュートリアル (9): セル間隔属性 CELLSPACING

テーブルがコンパクトになりすぎないように、テーブル内のセル間に一定の距離を設定できます。基本的な構文...

Vue.js $refs 使用例の説明

プロパティやイベントがあるにもかかわらず、JavaScript で子コンポーネントに直接アクセスする...