MySql の集計関数に条件式を追加する方法

MySql の集計関数に条件式を追加する方法

MySQL のフィルタリングのタイミングは、集計関数で使用される where 条件と having 条件です。

集約前のフィルタ

クエリに集計関数とwhere条件が含まれている場合、例えば
t.id<999 の場合、t から max(cid) を選択します。
このとき、最初にフィルタリングが実行され、その後に集計が実行されます。まず、ID が 999 未満のレコードを除外し、次に最大の cid を見つけて返します。

集約後にフィルターを適用する

Having はグループ化時にグループ化結果をフィルタリングするために使用され、通常は集計関数が含まれます。

appからip,MAX(id)を選択
ipでグループ化
MAX(id)>=5 を持つ

まずグループ化し、次に集計し、集計結果が5以上になる結果セットをフィルタリングします。

両者の違い:

最初にが実行され、次に集計関数が実行されます。集計関数が実行された後に、Having が実行されます。

以下は補足です

テーブルにはステータス フィールド (1: 成功、2: 失敗など) が必要です。ここで、日付のグループ化を使用して、さまざまな状態にあるアイテムの数をカウントする必要があります。

まずサブクエリを書く

aa.logDate、aa.totalLogs を選択 
 、(dxp.dxp_handlermodel から count(1) を選択、aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d')、executeStatus=1) pendingLogs
 、(dxp.dxp_handlermodel から count(1) を選択、aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d')、executeStatus=2) successLogs
 、(dxp.dxp_handlermodel から count(1) を選択、aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d')、executeStatus=3) errorLogs
 、(dxp.dxp_handlermodel から count(1) を選択、aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d')、executeStatus=4) callbackErrorLogs
から
(
 選択
 DATE_FORMAT( a.startTime, '%Y-%m-%d') ログ日付、
 count(1) 合計ログ
 dxp.dxp_handlermodel から 
 DATE_FORMAT( a.startTime, '%Y-%m-%d') でグループ化 
)

実行が非常に遅いので、カウントする条件を追加できるかどうか疑問に思い、次のことがわかりました。

選択
DATE_FORMAT(開始時刻、'%Y-%m-%d') ログ日付、
 count(1) 合計ログ、
 count(if(executeStatus=1,true,null)) 保留中のログ、
 count(if(executeStatus=2,true,null)) 成功ログ、
 count(if(executeStatus=3,true,null)) エラーログ、
 count(if(executeStatus=4,true,null)) コールバックエラーログ
dxp.dxp_handlermodel から
DATE_FORMAT( startTime, '%Y-%m-%d') でグループ化

理解しやすく、実行効率が高い

SUMやその他の集計関数などの他の集計関数も使用できます。

実例:

profile_visit_log から count(if(create_date < '2017-01-01' かつ host_profile_id = '9294d2bf-f457-4fe5-9a36-e5f832310dc2',true,null)) を選択 
-- select count(if(create_date < '2017-01-01',true,null)) count from profile_visit_log where host_profile_id = '9294d2bf-f457-4fe5-9a36-e5f832310dc2' と同等

さて、この記事はこれで終わりです。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL 集計関数のソート
  • MySQL グループ化クエリと集計関数
  • MySQL クエリのソートとクエリ集計関数の使用法の分析
  • MySQL の集計関数 count の使用法とパフォーマンスの最適化テクニック
  • MySQL の基本: グループ化関数、集計関数、グループ化クエリの詳細な説明

<<:  Vue ルーターにパラメータを渡すときにページを更新するとパラメータが失われる問題に対処する方法

>>:  IPとポートが接続可能かどうかを検出する方法

推薦する

Vue ドラッグ アンド ドロップのシンプルな実装

この記事では、主に次のような Vue ドラッグ アンド ドロップの簡単な実装を紹介します。レンダリン...

Linux 3.X/4.x/5.x でパゴダ パネルのパスワードを忘れた場合の解決方法

ssh に入り、次のコマンドを入力してパスワードをリセットします (コマンドの末尾の「testpas...

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

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

JavaScript 配列の重複排除とフラット化関数の紹介

目次1. 配列の平坦化(配列の次元削減とも呼ばれる)方法1: 削減メソッドを使用する方法2: スタッ...

JDBC-idea で mysql をインポートして java jar パッケージに接続する (mac)

序文1. この記事ではMySQL 8.0バージョンを使用していますバージョン5.0と比較すると、パッ...

Linuxでポートが開いているかどうかを確認する方法のまとめ

方法1: lsofコマンドを使用するlsof コマンドを使用して、ポートが開いているかどうかを確認で...

MySQL 8.0.17 解凍版のインストールと設定方法のグラフィックチュートリアル

インストール中に遭遇した問題を記録しておきますので、皆様のお役に立てれば幸いです。 1. ダウンロー...

Ubuntu環境でのPHP関連のパスと変更方法

Ubuntu環境におけるPHP関連パスPHP パス /usr/bin/php phpize5 /us...

MySQLでインデックスエラーが発生する状況について簡単に説明します

以下に、トレーニング機関からのヒントと私自身の要約をいくつか示します。以下のインデックスの内容を説明...

MySQL ディープ ページング (数千万のデータを素早くページ分割する方法)

目次序文場合最適化まとめ序文バックエンド開発では、一度に大量のデータがロードされ、メモリやディスク ...

CentOS で MySQL を完全にアンインストールする方法

この記事では、CentOSでのMySQLの完全アンインストールについて記録しています。具体的な内容は...

HTML テーブルタグチュートリアル (46): テーブルフッタータグ

<tfoot> タグは、テーブル フッターのスタイルを定義するために使用されます。基本構...

Linux システムで Java 環境変数を設定する方法

Java環境変数を設定するここで、環境変数は etc/profile に設定され、つまり、すべてのユ...

Linux システムのシャットダウンコマンドの違いと使い方の詳細な説明

Linux システムのシャットダウン コマンドは何ですか? Liangxu Tutorial Net...

MySQLインスタンスが起動できない問題の分析と解決

目次序文シナリオ分析要約する序文数日前、友人がWeChatで私に連絡してきて、マシンがダウンタイムか...