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ミニプログラムはどのようにしてユーザー情報とユーザーの電話番号を同時に取得するのか

推薦する

Firefox で Webdings フォントをサポートする方法

Firefox、Opera、その他のブラウザは Webdings フォントをサポートしていません。回...

Vueプロジェクトでのトークン検証ログイン(フロントエンド部分)

この記事の例では、Vueプロジェクトでのトークン検証ログインの具体的なコードを参考までに共有していま...

Windows 10 に MySQL 8.0.19 を zip 形式でインストールする詳細なチュートリアル

目次1.ダウンロード後、インストールしたいディレクトリに解凍します。 2. インストールディレクトリ...

ウェブページ作成時に標準 HTML コードを使用する際のポイント

<br />多くのウェブサイト デザイナーが犯す最も一般的な間違いは、ウェブページが I...

Centos8 でローカル Web サーバーを構築するための実装手順

1 概要システム Centos8 では、httpd を使用してローカル Web サーバーを構築します...

Vite+ElectronでVUE3デスクトップアプリケーションを素早く構築

目次1. はじめに2. Viteプロジェクトを作成する1. viteをインストールする2. プロジェ...

MySQLデータクエリが多すぎるとOOMが発生するかどうかについての簡単な議論

目次サーバー層でのフルテーブルスキャンの影響InnoDB におけるフルテーブルスキャンの影響Inno...

Docker で Tomcat を使用して Web アプリケーションを迅速にデプロイする方法の例

Docker の基本的な操作を学習した後、コンテナにいくつかの基本的なアプリケーションをデプロイして...

MySQLで最新のトランザクションIDを照会する方法

前に書いた内容: ビジネス ロジックの判断を行うために、最新のトランザクション ID を表示する必要...

CentOS7 で jar アプリケーションの起動を設定する方法

プロジェクトの展開中に遭遇した落とし穴Zhihudemo を展開する際、Jenkins などの自動展...

CentOS 7.6 Telnetサービス構築プロセス(Opensshアップグレードバトル第一弾のバックアップトランスポートライン構築)

不明な点があるときはいつでも、Blog Park にアクセスして、いつでも答えやインスピレーションを...

MySQL データベースの Binlog 使用法の概要 (必読)

MySQL データベースにとって binlog バイナリ ログがどれほど重要であるかについては詳し...

CSSは座席選択効果を実現するためにautoflow属性を使用する

1. 自動フロー属性、要素コンテンツの長さと幅が要素自体の長さと幅を超える場合、スクロールバーが表示...

JS 開発効率を上げる4つの超実践的なヒント

目次1. 短絡判定2. オプション連鎖演算子 (?) 3. ヌル合体演算子 (??) 4. 終了関数...

アップロード画像コントロールを実現するネイティブ js

この記事の例では、アップロード画像コントロールを実装するためのjsの具体的なコードを参考までに共有し...