ホームページ データベース mysql チュートリアル mysqlで個別の複数の列をカウントする問題を解決する方法

mysqlで個別の複数の列をカウントする問題を解決する方法

Jun 03, 2023 am 10:49 AM
mysql count distinct

再現されたテスト データベースは次のとおりです:

CREATE TABLE `test_distinct` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  `b` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
ログイン後にコピー

テーブル内のテスト データは次のとおりです。ここで、これら 3 つの列の重複排除後の列の数をカウントする必要があります。

mysqlで個別の複数の列をカウントする問題を解決する方法

#問題分析

友人は、問題を特定するために 4 つのクエリ ステートメントを教えてくれました。

SELECT COUNT(*) AS cnt FROM test_distinct;
SELECT COUNT(DISTINCT id, a, b) as cnt FROM test_distinct;
SELECT id, a, b, COUNT(*) AS cnt FROM test_distinct GROUP BY id, a, b HAVING cnt > 1;
SELECT 
	l.id AS l_id,
	l.a AS l_a,
	l.b AS l_b,
	r.id AS r_id,
	r.a AS r_a,
	r.b AS r_b
FROM test_distinct l LEFT JOIN test_distinct r
ON l.id = r.id AND l.a = r.a AND l.b = r.b
WHERE r.id is NULL or r.id = 'null';
ログイン後にコピー

クエリの結果は次のとおりです。 ## ########################################知らせ! ! !テストデータからどこに問題があるのか​​はすぐに推測できますが、テーブルには 30,000 件以上のデータがあり、肉眼でデータを確認することは不可能であることがわかりました。

上記のクエリ結果には直観に反した点が 2 つあります。

mysqlで個別の複数の列をカウントする問題を解決する方法

重複排除統計の後に 2 番目のデータが欠落していますが、3 番目のデータの結果には次のことが示されています。同一のデータは存在しません。 mysqlで個別の複数の列をカウントする問題を解決する方法

mysqlで個別の複数の列をカウントする問題を解決する方法同じテーブルを使用して左外部接続を行う場合、駆動テーブルにはデータがありますが、駆動テーブルは空です。

mysqlで個別の複数の列をカウントする問題を解決する方法

まず 2 番目の質問を見てみましょう。公式ドキュメントには次の説明があります:

ON 句を使用する場合、それに含まれる条件式は WHERE 句で使用されるものと同じです。一般的な状況は、ON 句を使用してテーブルの結合条件を指定し、WHERE 句を使用して結果セットに含まれる行を制限することです。
  • LEFT JOIN の ON または USING 部分の条件に一致する行が右側のテーブルにない場合、右側のテーブルは NULL に設定されたすべての列を使用します。
  • 算術比較演算子 (=、<、<> など) を使用して NULL を比較することはできません。

SELECT NULL = NULL;
SELECT NULL IS NULL;
ログイン後にコピー

  • したがって、2 番目の問題は、NULL=NULL の結果が常に False になることです。その結果、 2 つの行は元々等しいデータの結果は等しくありません。

    しかし、これでは最初の問題、つまり重複排除後にデータの一部が消えた理由は解決されません。ただし、欠落しているデータはおそらく NULL 値に関連していると推測できます。
  • カウントと個別の 2 つの操作を分離します。

    SELECT COUNT(*) as cnt FROM (SELECT  DISTINCT id, a, b FROM test_distinct) as tmp;
    ログイン後にコピー

え?結果は正しいです。つまり、mysqlで個別の複数の列をカウントする問題を解決する方法count(distinct expr)

によって生成されたクエリ プランは、想像したものと異なる可能性があります。最初に重複を削除してからカウントするわけではありません。クエリ プランを分析するには、 Explain を使用します。

mysqlで個別の複数の列をカウントする問題を解決する方法

表からわかるように、mysql 実行エンジンは

を直接カウントします。 count(distinct expr)

クエリとして、公式ドキュメントを確認してください: mysqlで個別の複数の列をカウントする問題を解決する方法

解決策

問題は最終的に明らかになりました。この問題を解決するには 2 つの方法があります。1 つ目は、最初に重複を削除してからカウントすることです。2 つ目は、mysqlで個別の複数の列をカウントする問題を解決する方法IFNULL()

関数を使用することです:

SELECT COUNT(DISTINCT id, a, IFNULL(b, &#39;0&#39;)) as cnt FROM test_distinct;
ログイン後にコピー
mysqlで個別の複数の列をカウントする問題を解決する方法さらに、count( )使用方法:

SELECT id, a, b, COUNT(*) FROM test_distinct GROUP BY id, a, b;
SELECT id, a, b, COUNT(b) FROM test_distinct GROUP BY id, a, b;
ログイン後にコピー

mysqlで個別の複数の列をカウントする問題を解決する方法

知識ポイント

算術比較演算子 (次のような) は使用できません。 =、) を使用して null 値を比較します。

count(distinct expr) は、expr 列内の空でない個別の行の数を返します。
  • COUNT() には 2 つの異なる用途があります。列内の値の数をカウントするために使用でき、もう 1 つは行の数をカウントするために使用できます。列の値をカウントする場合、列の値は空でない必要があります (NULL はカウントされません)。 COUNT() 関数のかっこ内に列または式が指定されている場合、関数は式に値を持つ結果の数をカウントします。 COUNT() のもう 1 つの機能は、結果セット内の行数をカウントすることです。 MySQL は、括弧内の式の値を空にすることができないことを確認すると、実際には行数をカウントします。最も単純なことは、COUNT() を使用する場合です。この場合、ワイルドカードは予想したようにすべての列に展開されません。実際、すべての列が無視され、すべての行が直接カウントされます - "ハイパフォーマンス MySQL";

  • InnoDB では、SELECT COUNT(*) と SELECT COUNT(1) は同じ方法で処理され、パフォーマンスに違いはありません。

  • 以上がmysqlで個別の複数の列をカウントする問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    Video Face Swap

    Video Face Swap

    完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    phpmyadminを開く方法 phpmyadminを開く方法 Apr 10, 2025 pm 10:51 PM

    次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

    MySQL:世界で最も人気のあるデータベースの紹介 MySQL:世界で最も人気のあるデータベースの紹介 Apr 12, 2025 am 12:18 AM

    MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

    MySQLの場所:データベースとプログラミング MySQLの場所:データベースとプログラミング Apr 13, 2025 am 12:18 AM

    データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

    なぜMySQLを使用するのですか?利点と利点 なぜMySQLを使用するのですか?利点と利点 Apr 12, 2025 am 12:17 AM

    MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

    Apacheのデータベースに接続する方法 Apacheのデータベースに接続する方法 Apr 13, 2025 pm 01:03 PM

    Apacheはデータベースに接続するには、次の手順が必要です。データベースドライバーをインストールします。 web.xmlファイルを構成して、接続プールを作成します。 JDBCデータソースを作成し、接続設定を指定します。 JDBC APIを使用して、接続の取得、ステートメントの作成、バインディングパラメーター、クエリまたは更新の実行、結果の処理など、Javaコードのデータベースにアクセスします。

    DockerによるMySQLを開始する方法 DockerによるMySQLを開始する方法 Apr 15, 2025 pm 12:09 PM

    DockerでMySQLを起動するプロセスは、次の手順で構成されています。MySQLイメージをプルしてコンテナを作成および起動し、ルートユーザーパスワードを設定し、ポート検証接続をマップしてデータベースを作成し、ユーザーはすべての権限をデータベースに付与します。

    Centosはmysqlをインストールします Centosはmysqlをインストールします Apr 14, 2025 pm 08:09 PM

    CentOSにMySQLをインストールするには、次の手順が含まれます。適切なMySQL Yumソースの追加。 yumを実行して、mysql-serverコマンドをインストールして、mysqlサーバーをインストールします。ルートユーザーパスワードの設定など、MySQL_SECURE_INSTALLATIONコマンドを使用して、セキュリティ設定を作成します。必要に応じてMySQL構成ファイルをカスタマイズします。 MySQLパラメーターを調整し、パフォーマンスのためにデータベースを最適化します。

    MySQLの役割:Webアプリケーションのデータベース MySQLの役割:Webアプリケーションのデータベース Apr 17, 2025 am 12:23 AM

    WebアプリケーションにおけるMySQLの主な役割は、データを保存および管理することです。 1.MYSQLは、ユーザー情報、製品カタログ、トランザクションレコード、その他のデータを効率的に処理します。 2。SQLクエリを介して、開発者はデータベースから情報を抽出して動的なコンテンツを生成できます。 3.MYSQLは、クライアントサーバーモデルに基づいて機能し、許容可能なクエリ速度を確保します。

    See all articles