ホームページ データベース mysql チュートリアル SQL で複数の左結合が間違ったカウント結果を引き起こす原因と、これを修正するにはどうすればよいですか?

SQL で複数の左結合が間違ったカウント結果を引き起こす原因と、これを修正するにはどうすればよいですか?

Jan 23, 2025 pm 12:16 PM

How Can Multiple Left Joins Lead to Incorrect Count Results in SQL, and How Can This Be Fixed?

不正なカウント結果を引き起こす SQL 複数左結合のトラップと解決策

SQL を使用する場合、複数の左結合が正しく処理されないと、予期しない結果が発生する可能性があります。次のクエリを考えてみましょう:

1

2

3

4

5

6

7

8

9

10

SELECT

    t1."id" AS "User ID",

    t1.account_balance AS "Account Balance",

    count(t2.user_id) AS "# of grocery visits",

    count(t3.user_id) AS "# of fishmarket visits"

FROM users t1

LEFT OUTER JOIN grocery t2 ON (t2.user_id=t1."id")

LEFT OUTER JOIN fishmarket t3 ON (t3.user_id=t1."id")

GROUP BY t1.account_balance,t1.id

ORDER BY t1.id

ログイン後にコピー

このクエリは、users テーブル内の各ユーザーの 2 つの関連テーブル groceryfishmarket への訪問数をカウントしようとします。ただし、左結合の性質により、不正確な結果が生成されます。

左結合に関する誤解

SQL では、結合は左から右に実行されます。このクエリでは、最初に usersgrocery の間の左結合が実行されます。これにより、各ユーザー レコードが対応する食料品購入レコードに関連付けられます。次に、最初の結合結果と fishmarket の間で 2 番目の左結合が実行されます。これは、食料品の購入記録を持つ各ユーザー レコードが、対応する魚市場の購入記録とさらに結合されることを意味します。

加算ではなく乗算

この順次処理の意図しない結果として、groceryfishmarket からのアクセス数が加算されるのではなく乗算されてしまいます。たとえば、ユーザーが食料品店への訪問が 3 回、魚市場への訪問が 4 回あった場合、クエリでは予想される 7 回ではなく 12 回の訪問が返されます。

解決策: 集計にサブクエリを使用する

これを修正するには、テーブルに結合する前に訪問数の集計 (カウント) を実行する必要があります。これはサブクエリを使用して実現できます:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

SELECT u.id

, u.account_balance

, g.grocery_visits

, f.fishmarket_visits

FROM   users u

LEFT   JOIN (

   SELECT user_id, count(*) AS grocery_visits

   FROM   grocery

   GROUP  BY user_id

   ) g ON g.user_id = u.id

LEFT   JOIN (

   SELECT user_id, count(*) AS fishmarket_visits

   FROM   fishmarket

   GROUP  BY user_id

   ) f ON f.user_id = u.id

ORDER  BY u.id;

ログイン後にコピー

この変更されたクエリは、サブクエリ内の訪問数を集計し、集計結果を users テーブルと結合して、訪問数が誤って増加しないようにします。

以上がSQL で複数の左結合が間違ったカウント結果を引き起こす原因と、これを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

DockerでのMySQLメモリの使用を減らします DockerでのMySQLメモリの使用を減らします Mar 04, 2025 pm 03:52 PM

DockerでのMySQLメモリの使用を減らします

Alter Tableステートメントを使用してMySQLのテーブルをどのように変更しますか? Alter Tableステートメントを使用してMySQLのテーブルをどのように変更しますか? Mar 19, 2025 pm 03:51 PM

Alter Tableステートメントを使用してMySQLのテーブルをどのように変更しますか?

mysqlの問題を解決する方法共有ライブラリを開くことができません mysqlの問題を解決する方法共有ライブラリを開くことができません Mar 04, 2025 pm 04:01 PM

mysqlの問題を解決する方法共有ライブラリを開くことができません

sqliteとは何ですか?包括的な概要 sqliteとは何ですか?包括的な概要 Mar 04, 2025 pm 03:55 PM

sqliteとは何ですか?包括的な概要

Linuxでmysqlを実行します(phpmyAdminを使用してポッドマンコンテナを使用して/なし) Linuxでmysqlを実行します(phpmyAdminを使用してポッドマンコンテナを使用して/なし) Mar 04, 2025 pm 03:54 PM

Linuxでmysqlを実行します(phpmyAdminを使用してポッドマンコンテナを使用して/なし)

MACOSで複数のMySQLバージョンを実行する:ステップバイステップガイド MACOSで複数のMySQLバージョンを実行する:ステップバイステップガイド Mar 04, 2025 pm 03:49 PM

MACOSで複数のMySQLバージョンを実行する:ステップバイステップガイド

人気のあるMySQL GUIツール(MySQL Workbench、PhpMyAdminなど)は何ですか? 人気のあるMySQL GUIツール(MySQL Workbench、PhpMyAdminなど)は何ですか? Mar 21, 2025 pm 06:28 PM

人気のあるMySQL GUIツール(MySQL Workbench、PhpMyAdminなど)は何ですか?

共通の脆弱性(SQLインジェクション、ブルートフォース攻撃)に対してMySQLを保護するにはどうすればよいですか? 共通の脆弱性(SQLインジェクション、ブルートフォース攻撃)に対してMySQLを保護するにはどうすればよいですか? Mar 18, 2025 pm 12:00 PM

共通の脆弱性(SQLインジェクション、ブルートフォース攻撃)に対してMySQLを保護するにはどうすればよいですか?

See all articles