結合は左から右に処理されます(括弧で指定されている場合を除く)。 LEFT JOIN
の場合 (または単にJOIN
、同様の効果)1人のユーザーに3つの食料品を購入すると、3行( 1 x 3 )になります。 )。その後、同じユーザーの4つの魚市場に参加すると、12( 3 x 4 )になります。 )行、乗算 追加ではなく、結果の前のカウント あなたが望んでいたかもしれないように、それに。
それによって、食料品や魚市場への訪問を同様に増やします。
次のように機能させることができます:
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;
1人または数人のユーザーの集計値を取得するには、相関サブクエリ 提供された@Vinceのように問題ありません。テーブル全体またはその主要部分については、nテーブルを集計し、結果に結合する方が(はるかに)効率的です 。このように、別のGROUP BY
も必要ありません。 外側のクエリで。
grocery_visits
およびfishmarket_visits
NULL
です それぞれのテーブルに関連するエントリがないユーザーの場合。 0
が必要な場合 代わりに(または任意の数)、 COALESCE
を使用してください 外側のSELECT
:
SELECT u.id
, u.account_balance
, COALESCE(g.grocery_visits , 0) AS grocery_visits
, COALESCE(f.fishmarket_visits, 0) AS fishmarket_visits
FROM ...