Gabungan Luar Kiri: Memastikan Pendapatan Data Lengkap dari Jadual Kiri
Salah tanggapan biasa dengan cantuman luar kiri ialah mereka sentiasa mengembalikan semua baris dari jadual kiri. Ini tidak selalu benar; baris daripada jadual kiri akan diketepikan jika tiada baris yang sepadan wujud dalam jadual kanan berdasarkan syarat cantuman.
Mari kita gambarkan ini dengan contoh. Bayangkan pertanyaan yang direka untuk mengira paparan halaman harian untuk pengguna tertentu (open_id):
<code class="language-sql">SELECT day.days, COUNT(*) AS views FROM day LEFT OUTER JOIN tracking ON day.days = DAY(FROM_UNIXTIME(open_date)) WHERE tracking.open_id = 10 GROUP BY day.days</code>
Pertanyaan ini bertujuan untuk memaparkan semua hari dan kiraan tontonan yang berkaitan. Walau bagaimanapun, jika day
mengandungi entri untuk setiap hari dalam bulan itu, tetapi tracking
kekurangan entri untuk beberapa hari untuk open_id = 10
, hari-hari tersebut akan tiada dalam keputusan.
Penyelesaian terletak pada memasukkan WHERE
syarat klausa ke dalam klausa ON
gabungan:
<code class="language-sql">SELECT day.days, COUNT(tracking.open_date) AS views FROM day LEFT OUTER JOIN tracking ON day.days = DAY(FROM_UNIXTIME(open_date)) AND tracking.open_id = 10 GROUP BY day.days</code>
Dengan mengalihkan tracking.open_id = 10
ke dalam klausa ON
, syarat menjadi sebahagian daripada cantuman itu sendiri, bukan penapis pasca-cantum. Ini memastikan semua baris daripada jadual day
disertakan, dengan views
menunjukkan 0 untuk hari tanpa pemadanan entri dalam jadual tracking
. Perhatikan penggunaan COUNT(tracking.open_date)
dan bukannya COUNT(*)
untuk menggambarkan bilangan tontonan dengan tepat; COUNT(*)
masih akan mengira hari walaupun tiada baris yang sepadan dalam jadual yang betul.
Atas ialah kandungan terperinci Mengapa Gabungan Luar Kiri Saya Tidak Mengembalikan Semua Baris dari Jadual Kiri?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!