Rumah >pangkalan data >tutorial mysql >Bagaimanakah Gabungan Berbilang Kiri Boleh Membawa kepada Keputusan Kiraan yang Tidak Betul dalam SQL, dan Bagaimana Ini Boleh Dibetulkan?

Bagaimanakah Gabungan Berbilang Kiri Boleh Membawa kepada Keputusan Kiraan yang Tidak Betul dalam SQL, dan Bagaimana Ini Boleh Dibetulkan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-23 12:16:10808semak imbas

How Can Multiple Left Joins Lead to Incorrect Count Results in SQL, and How Can This Be Fixed?

Perangkap dan penyelesaian untuk SQL berbilang gabungan kiri yang membawa kepada hasil pengiraan yang salah

Apabila menggunakan SQL, jika gabungan berbilang kiri tidak dikendalikan dengan betul, hasil yang tidak dijangka mungkin berlaku. Pertimbangkan pertanyaan berikut:

<code class="language-sql">SELECT
    t1."id" AS "User ID",
    t1.account_balance AS "Account Balance",
    count(t2.user_id) AS "# of grocery visits",
    count(t3.user_id) AS "# of fishmarket visits"
FROM users t1
LEFT OUTER JOIN grocery t2 ON (t2.user_id=t1."id") 
LEFT OUTER JOIN fishmarket t3 ON (t3.user_id=t1."id") 
GROUP BY t1.account_balance,t1.id
ORDER BY t1.id</code>

Pertanyaan ini cuba mengira bilangan lawatan ke dua jadual yang berkaitan users dan grocery untuk setiap pengguna dalam jadual fishmarket. Walau bagaimanapun, disebabkan sifat cantuman kiri, ia menghasilkan hasil yang salah.

Salah faham tentang penyertaan kiri

Dalam SQL, cantuman dilakukan dari kiri ke kanan. Dalam pertanyaan ini, sambung kiri antara users dan grocery mula-mula dilakukan. Ini menyebabkan setiap rekod pengguna disambungkan ke rekod pembelian runcit yang sepadan. Seterusnya, sambungan kiri kedua dilakukan antara hasil penyertaan pertama dan fishmarket, yang bermaksud setiap rekod pengguna dengan rekod pembelian runcit akan disambungkan lagi dengan rekod pembelian pasaran ikan yang sepadan.

Pendaraban bukan penambahan

Akibat yang tidak diingini daripada pemprosesan berjujukan ini ialah pengiraan akses daripada grocery dan fishmarket didarab dan bukannya ditambah. Sebagai contoh, jika pengguna mempunyai 3 lawatan runcit dan 4 lawatan pasar ikan, pertanyaan itu akan menghasilkan 12 lawatan berbanding 7 yang dijangkakan.

Penyelesaian: Gunakan subkueri untuk pengagregatan

Untuk membetulkannya, kami perlu memastikan kami melakukan pengagregatan (kiraan) bilangan lawatan sebelum menyertai jadual. Ini boleh dicapai dengan 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 diubah suai ini mengagregatkan lawatan dalam subkueri dan kemudian menggabungkan hasil agregat dengan jadual users, memastikan lawatan tidak didarab secara tidak sengaja.

Atas ialah kandungan terperinci Bagaimanakah Gabungan Berbilang Kiri Boleh Membawa kepada Keputusan Kiraan yang Tidak Betul dalam SQL, dan Bagaimana Ini Boleh Dibetulkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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