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操作にアクセスする

推薦する

Mysql マスタースレーブレプリケーションの注意事項の説明

1. マスター'x@xxxx:x'への接続エラー- 再試行時間: 60 再試行回数:...

MySQL 5.7.17 最新インストールチュートリアル(画像とテキスト付き)

mysql-5.7.17-winx64 は MySQL の最新バージョンです。インストールは無料で...

JavaScriptでカレンダー効果を素早く実装

この記事では、カレンダー効果を素早く実現するためのJavaScriptの具体的なコードを例として紹介...

CSS 属性セレクタを使用して HTML DNA を接合する方法

CSS 属性セレクターは素晴らしいです。大量のクラス名を追加することを回避し、コード内の問題を指摘す...

バックアップ データをインポートするときに innodb_index_stats がエラーを報告する場合の主キー競合の解決方法

障害の説明percona5.6、mysqldump フルバックアップ、バックアップデータのインポート...

MySQLデータベースで列を追加、削除、変更する方法

この記事では、例を使用して、MySQL データベースの列を追加、削除、および変更する方法について説明...

CSSスタイルシートとフォーマットレイアウトの詳細な説明

スタイルシートCSS (カスケーディング スタイル シート) は、HTML Web ページを美しくす...

MySQL 8.0.13 で日付を 0000-00-00 00:00:00 に設定すると発生する問題を解決する

データベース操作を学び始めたばかりです。今日、データを保存していたところ、エラーが発生していることに...

ウェブデザイナーが持つべき7つのスキル

Web デザインは科学であると同時に芸術でもあります。 Web デザイン作業は、半分は適切なプログラ...

MySQLデータ復旧のさまざまな方法の概要

目次1. はじめに2. 直接回復2.1 mysqldumpバックアップの完全リカバリ2.2 xtra...

Vue のループフォーム項目例の詳細な説明

場合によっては、ユーザーがボタンをクリックして同様のフォームを追加し、クリックごとに 1 回追加でき...

mysql5.7.19 winx64 インストールおよび構成方法のグラフィック チュートリアル (win10)

mysql 5.7.19 winx64のインストールチュートリアルは以下のように記録され、みんなと...

Linux に mysql をインストールするときに /etc に my.cnf ファイルがない問題を解決する

今日、mysql ポートを変更したいと思ったのですが、/etc/ ディレクトリに my.cnf ファ...

Vue の基本リスナーの詳細な説明

目次Vueのリスナーとは何かリスナーの使い方vue リスナーウォッチVue リスナー - ディープリ...

手の動きをリアルタイムで監視するための Handtrack.js ライブラリ (推奨)

【はじめに】: Handtrack.jsは、ブラウザ上で直接リアルタイムの手の動きの追跡と検出を実...