Các phép nối được xử lý từ trái sang phải (trừ khi dấu ngoặc đơn quy định khác). Nếu bạn LEFT JOIN
(hoặc chỉ JOIN
, hiệu ứng tương tự) ba cửa hàng tạp hóa cho một người dùng, bạn nhận được 3 hàng ( 1 x 3 ). Sau đó, nếu bạn tham gia 4 chợ cá cho cùng một người dùng, bạn nhận được 12 ( 3 x 4 ) hàng, nhân số đếm trước đó trong kết quả, không phải thêm nó, giống như bạn có thể đã hy vọng.
Qua đó nhân lên số lượt ghé thăm cửa hàng tạp hóa và chợ cá.
Bạn có thể làm cho nó hoạt động như sau:
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;
Để nhận các giá trị tổng hợp cho một hoặc một vài người dùng, truy vấn con tương quan như @Vince được cung cấp là tốt. Đối với toàn bộ bảng hoặc các phần chính của nó, sẽ hiệu quả hơn (nhiều) nếu tổng hợp n-bảng và kết hợp với kết quả một lần . Bằng cách này, chúng tôi cũng không cần GROUP BY
khác trong truy vấn bên ngoài.
grocery_visits
và fishmarket_visits
là NULL
cho người dùng không có bất kỳ mục nhập liên quan nào trong các bảng tương ứng. Nếu bạn cần 0
thay vào đó (hoặc bất kỳ số tùy ý nào), hãy sử dụng COALESCE
trong SELECT
bên ngoài :
SELECT u.id
, u.account_balance
, COALESCE(g.grocery_visits , 0) AS grocery_visits
, COALESCE(f.fishmarket_visits, 0) AS fishmarket_visits
FROM ...