ホームページ >データベース >mysql チュートリアル >2 つの SQL LEFT JOINS が間違った訪問数を返すのはなぜですか?

2 つの SQL LEFT JOINS が間違った訪問数を返すのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-23 12:27:10262ブラウズ

Why Are My Two SQL LEFT JOINS Returning Incorrect Visit Counts?

SQL LEFT JOIN のデバッグ: 正確な訪問数

SQL で複数の LEFT JOIN を使用して異なるテーブルにわたる訪問数をカウントする場合、一般的な問題が発生します。 この例では、usersgroceryfishmarket の 3 つのテーブルを使用します。 各ユーザーの食料品店と魚市場の両方への訪問をカウントするように設計されたクエリでは、不正確な結果が生成されます。

この問題は、結合の順次的な性質に起因します。 単純なアプローチでは、最初に usersgrocery を結合し、null 以外の account_balance とその食料品店への訪問を含む各ユーザーの行を作成します。 その後の fishmarket との結合により、各ユーザーの食料品店の訪問数と魚市場の訪問数が誤って乗算されます。 これにより、訪問合計が膨らむことになります。

この解決策には、訪問数をテーブルに結合するusersにクエリを再構築することが含まれます。 これは、2 つの相関サブクエリを使用して効率的に実現されます。各サブクエリは、grocery または fishmarket テーブルの訪問を個別にカウントし、user_id でグループ化します。 これらの集計されたカウントは users テーブルに結合され、正確な訪問合計が保証されます。

サブクエリを使用した修正されたクエリは次のとおりです:

<code class="language-sql">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;</code>

この改訂されたクエリは、各ユーザーの食料品店と魚市場の訪問回数を正確かつ独立して提供し、元のクエリの乗算エラーを解決します。

以上が2 つの SQL LEFT JOINS が間違った訪問数を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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