ホームページ >データベース >mysql チュートリアル >2 つの SQL LEFT JOINS が間違った訪問数を返すのはなぜですか?
SQL LEFT JOIN のデバッグ: 正確な訪問数
SQL で複数の LEFT JOIN
を使用して異なるテーブルにわたる訪問数をカウントする場合、一般的な問題が発生します。 この例では、users
、grocery
、fishmarket
の 3 つのテーブルを使用します。 各ユーザーの食料品店と魚市場の両方への訪問をカウントするように設計されたクエリでは、不正確な結果が生成されます。
この問題は、結合の順次的な性質に起因します。 単純なアプローチでは、最初に users
と grocery
を結合し、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 サイトの他の関連記事を参照してください。