MySQL の if 関数の正しい使い方の詳細な説明

MySQL の if 関数の正しい使い方の詳細な説明

今日私が書こうとしている内容では、プログラムは 7 時間近く実行され、データベースに 1,000 万個のデータが保存されました。 ——

本日お話ししたいのは、MySQL データベースの IF() 関数の例です。

具体的なシナリオは次のとおりです。

まずテーブル構造を見てみましょう。

テーブル `message` を作成します (
 `id` varchar(30) NOT NULL,
 `title` varchar(30) デフォルト NULL,
 `content` テキスト、
 `send_time` 日時 デフォルト NULL、
 `type` int(1) DEFAULT NULL COMMENT '1: システム通知、2: 苦情提案',
 `status` int(1) DEFAULT NULL COMMENT '0: 送信待ち、1: 成功、2: 失敗',
 主キー (`id`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

具体的な要件は、システム通知と苦情提案の合計数、成功数、失敗数をそれぞれカウントすることです。

このような問題が発生した場合、一般的な考え方としては、タイプ グループ化を使用して、システム通知、苦情、提案の合計数をそれぞれ照会し、次に 2 つのサブクエリを使用して成功した項目と失敗した項目の数をカウントします。 SQL は次のとおりです。

選択
 COUNT(1) 合計、
 m.タイプ、
 (選択
   カウント(1)
  メッセージ送信者 ms
  ここで、ms.status = 1
    AND m.type = ms.type) 成功合計、
 (選択
   カウント(1)
  メッセージ mf から
  ここで、mf.status = 1
    かつ、m.type = mf.type) 失敗合計
メッセージmから
GROUP BY m.type

実行時間を見てみましょう。1000万個のデータをカウントするのに約6分18秒かかります。

では、もっと簡単で速いカウント方法はあるのでしょうか? もちろんあります。それが、今日主に取り上げる if() 関数です。

基本的な構文

IF(expr1, expr2, expr3) は、expr1 の値が true の場合は expr2 の値を返し、expr1 の値が false の場合は expr3 の値を返します。単純な三項式です。

やり方

アイデアについてお話ししましょう。成功した結果の数を数える場合、if(status=1,1,0) を次のように記述できます。status==1 の場合は 1 を返し、それ以外の場合は 0 を返します。次に、SUM() 関数を使用して成功した結果の数を合計します。

実装

SQL ステートメントは次のとおりです。

選択
 COUNT(1) 合計、
 m.タイプ、
 SUM(IF(m.status = 1,1,0)) 成功合計、
 SUM(IF(m.status != 1,1,0)) 失敗合計
メッセージmから
GROUP BY m.type;

上記のサブクエリよりもずっとシンプルに見えませんか? 実行時間を見てみましょう。わずか 1 分 30 秒です。ずっと速くないですか?

それで、今日はそれを学びましたか?

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL の null (IFNULL、COALESCE、NULLIF) に関する知識ポイントのまとめ
  • MySQL での coalesce() の使用に関するヒントのまとめ
  • MySQL で null を置き換える IFNULL() および COALESCE() 関数の詳細な説明
  • SQL Server COALESCE 関数の詳細な説明と例
  • SQL Server のページング モード ISNULL と COALESCE のパフォーマンス比較の簡単な分析
  • MySQL 時間差関数 (TIMESTAMPDIFF、DATEDIFF)、日付変換計算関数 (date_add、day、date_format、str_to_date)
  • MySQLはカスタム関数を使用して親IDまたは子IDを再帰的に照会します
  • MySql COALESCE 関数の使用コード例

<<:  JSはタイムラインの自動再生を実現する

>>:  WeChatミニプログラムはどのようにしてユーザー情報とユーザーの電話番号を同時に取得するのか

推薦する

Dockerfile 内の予約語命令の解析処理

目次1. Dockerfile とは何ですか? 2. Dockerfile構築プロセスの分析3. D...

ウェブページ印刷細線表+ページ印刷究極の戦略

最近、クライアントのために印刷していたとき、ページのヘッダーを印刷するのではなく、表の内容だけを印刷...

MySQLの文字セットを変更する方法

1. MySQLの文字セットを確認する '%char%' のような変数を表示します。...

MySQLが基礎データ構造としてB+ツリーを使用する理由

MySQL の基盤となるデータ構造が B+ ツリーであることは誰もが知っていますが、ではなぜ赤黒ツリ...

HiveメタデータをMySQLに設定するプロセス全体

Hiveのインストールディレクトリで、confディレクトリに入り、hive-site.xmlファイル...

vscodeを使用してReact Native開発環境を構築する方法を教えます

質問コードにはプロンプトがありません: RN 開発に不慣れな、フロントエンド以外の学生の多くは、「ど...

CSS の両端揃えを実現する div+css レイアウトの 4 つの方法の概要

2 端揃えを実現する div+css レイアウトは、Web ページの組版でよく使用されます。この記事...

Vue nextTickの原理の分析

目次イベントループmiscroTask (マイクロタスク) UI レンダリング (重要なポイント)次...

Navicat for SQLite で中国語データを CSV にインポートする方法

この記事では、参考までに、csv中国語データをNavicat for SQLiteにインポートする具...

WangEditor リッチ テキスト コンポーネントを Angular でカプセル化する方法

リッチ テキスト コンポーネントは、Web プログラムで、特にブログやフォーラムなどの Web サイ...

Tomcat クラスローダーの実装方法とサンプルコード

Tomcat は内部的に複数の ClassLoader を定義し、アプリケーションとコンテナーが異な...

開発効率を向上させる 20 の JavaScript ヒント

目次1. 配列を宣言して初期化する2. 合計、最小値、最大値を計算する3. 文字列、数値、オブジェク...

Mysql が CPU を過剰に占有する場合の最適化方法 (必読)

Mysql が CPU を占有しすぎる場合、どこから最適化を開始すればよいでしょうか? CPU 使...

ブラウザでのjsのイベントループイベントキューの詳細な説明

目次序文スタックと2つのキューを理解する実行プロセス簡単な例より難しい例要約する序文以下の内容はブラ...

MySQL 30軍事ルールの詳細な説明

1. 基本仕様(1)InnoDBストレージエンジンを使用する必要があります。解釈:トランザクション、...