Memahami Kiraan Lawatan Tidak Tepat dengan Berbilang SQL LEFT JOIN
Artikel ini menyiasat isu pertanyaan SQL biasa: mendapatkan kiraan lawatan yang salah apabila menggunakan berbilang operasi LEFT JOIN
. Matlamatnya ialah untuk mendapatkan semula data pengguna, termasuk baki akaun, lawatan kedai runcit dan lawatan pasar ikan. Pertanyaan naif selalunya menghasilkan hasil yang melambung (mis., "1", "12", "12").
Masalahnya berpunca daripada pelaksanaan kiri-ke-kanan LEFT JOIN
s. Setiap cantuman seterusnya mendarabkan kiraan baris jika terdapat berbilang entri yang sepadan dalam jadual yang dicantumkan. Sebagai contoh, menyertai tiga jadual runcit kepada seorang pengguna menghasilkan tiga baris. Gabungan seterusnya dengan empat jadual pasar ikan kemudian mengembangkannya kepada dua belas baris, yang membawa kepada kiraan lawatan yang tidak tepat.
Penyelesaian: Pra-pengagregatan dengan Subkueri
Penyelesaian melibatkan pra-mengagregatkan kiraan lawatan untuk setiap jadual sebelum menyertainya ke jadual users
. Ini menghalang isu pendaraban baris. Pertanyaan yang diperbetulkan menggunakan subkueri untuk mencapai 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;
Mengendalikan Nilai Yang Hilang dengan COALESCE
Untuk mengendalikan kes dengan anggun di mana pengguna tidak mempunyai lawatan ke lokasi tertentu, fungsi COALESCE
boleh menggantikan nilai NULL
dengan 0 (atau mana-mana nilai lain yang dikehendaki):
SELECT u.id, u.account_balance, COALESCE(g.grocery_visits, 0) AS grocery_visits, COALESCE(f.fishmarket_visits, 0) AS 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;
Pertanyaan yang dipertingkatkan ini menggambarkan dengan tepat bilangan lawatan kedai runcit dan pasar ikan untuk setiap pengguna. Dengan pra-mengagregatkan data, kami mengelakkan perangkap melata LEFT JOIN
s dan memastikan hasil yang tepat.
Atas ialah kandungan terperinci Mengapakah Berbilang SQL LEFT JOIN Menghasilkan Kiraan Lawatan yang Salah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!