Gabungan diproses dari kiri ke kanan (kecuali tanda kurung menentukan sebaliknya). Jika Anda LEFT JOIN
(atau cukup JOIN
, efek serupa) tiga bahan makanan untuk satu pengguna Anda mendapatkan 3 baris (1 x 3 ). Jika Anda kemudian bergabung dengan 4 pasar ikan untuk pengguna yang sama, Anda mendapatkan 12 (3 x 4 ) baris, menggandakan hitungan sebelumnya dalam hasil, bukan menambahkan untuk itu, seperti yang Anda harapkan.
Dengan demikian melipatgandakan kunjungan untuk bahan makanan dan pasar ikan.
Anda dapat membuatnya bekerja seperti ini:
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;
Untuk mendapatkan nilai gabungan untuk satu atau beberapa pengguna, subkueri berkorelasi seperti yang disediakan @Vince baik-baik saja. Untuk seluruh tabel atau bagian utama darinya, (jauh) lebih efisien untuk menggabungkan n-tabel dan menggabungkan ke hasil sekali . Dengan cara ini, kita juga tidak perlu lagi GROUP BY
di kueri luar.
grocery_visits
dan fishmarket_visits
adalah NULL
untuk pengguna tanpa entri terkait di tabel masing-masing. Jika Anda membutuhkan 0
sebagai gantinya (atau nomor sembarang), gunakan COALESCE
di bagian luar SELECT
:
SELECT u.id
, u.account_balance
, COALESCE(g.grocery_visits , 0) AS grocery_visits
, COALESCE(f.fishmarket_visits, 0) AS fishmarket_visits
FROM ...