Menyahpepijat SQL LEFT JOIN: Kiraan Lawatan Tepat
Masalah biasa timbul apabila menggunakan berbilang LEFT JOIN
s dalam SQL untuk mengira lawatan merentas jadual yang berbeza. Contoh ini menggunakan tiga jadual: users
, grocery
dan fishmarket
. Pertanyaan yang direka untuk mengira lawatan setiap pengguna ke kedai runcit dan pasar ikan menghasilkan keputusan yang tidak tepat.
Isu ini berpunca daripada sifat berurutan daripada cantuman. Pendekatan naif menyertai users
dan grocery
terlebih dahulu, mencipta baris untuk setiap pengguna dengan account_balance
bukan nol dan lawatan runcit mereka. Gabungan seterusnya dengan fishmarket
kemudian tersalah mendarabkan kiraan lawatan runcit dengan kiraan lawatan pasar ikan untuk setiap pengguna. Ini membawa kepada jumlah lawatan yang meningkat.
Penyelesaian melibatkan penstrukturan semula pertanyaan untuk mengagregat kiraan lawatan sebelum menyertai mereka ke jadual users
. Ini dicapai dengan cekap menggunakan dua subkueri berkorelasi. Setiap subkueri secara bebas mengira lawatan sama ada untuk jadual grocery
atau fishmarket
, dikumpulkan mengikut user_id
. Kiraan agregat ini kemudiannya dicantumkan ke jadual users
, memastikan jumlah lawatan yang tepat.
Berikut ialah pertanyaan yang diperbetulkan menggunakan subkueri:
<code class="language-sql">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;</code>
Pertanyaan yang disemak ini memberikan kiraan yang tepat dan bebas bagi lawatan kedai runcit dan pasar ikan untuk setiap pengguna, menyelesaikan ralat pendaraban pertanyaan asal.
Atas ialah kandungan terperinci Mengapa Dua SQL Saya LEFT JOIN Mengembalikan Kiraan Lawatan yang Salah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!