Rumah > pangkalan data > tutorial mysql > Mengapakah Berbilang SQL LEFT JOIN Menghasilkan Kiraan Lawatan yang Salah?

Mengapakah Berbilang SQL LEFT JOIN Menghasilkan Kiraan Lawatan yang Salah?

Barbara Streisand
Lepaskan: 2025-01-23 12:18:09
asal
717 orang telah melayarinya

Why Do Multiple SQL LEFT JOINs Produce Incorrect Visit Counts?

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 JOINs. 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;
Salin selepas log masuk

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;
Salin selepas log masuk

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 JOINs 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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan