Rumah > pangkalan data > tutorial mysql > Left Joins dan Klausa WHERE: Bagaimana Ia Berinteraksi, dan Bagaimana Saya Boleh Mengelakkan Keputusan Yang Tidak Dijangka?

Left Joins dan Klausa WHERE: Bagaimana Ia Berinteraksi, dan Bagaimana Saya Boleh Mengelakkan Keputusan Yang Tidak Dijangka?

DDD
Lepaskan: 2024-12-31 18:05:12
asal
993 orang telah melayarinya

Left Joins and WHERE Clauses: How Do They Interact, and How Can I Avoid Unexpected Results?

The Quirks of Left Joins and WHERE Clauses

Apabila menjalankan operasi pengambilan data, pembangun sering menggunakan gabungan kiri untuk menggabungkan maklumat daripada berbilang jadual. Walau bagaimanapun, perangkap biasa timbul apabila menggunakan klausa WHERE bersama dengan cantuman kiri, yang berpotensi mengubah tingkah laku cantuman kiri.

Pertimbangkan pernyataan SQL berikut:

SELECT
a.foo
b.bar
c.foobar
FROM tableOne AS a
INNER JOIN tableTwo AS b ON a.pk = b.fk
LEFT JOIN tableThree AS c ON b.pk = c.fk
WHERE a.foo = 'something'
AND c.foobar = 'somethingelse'
Salin selepas log masuk

Secara intuitif, seseorang akan jangkakan penyataan ini melakukan cantuman kiri antara tableThree dan tableTwo, menyatakan keadaan penapis untuk c.foobar. Walau bagaimanapun, kehadiran klausa WHERE yang mengandungi c.foobar = 'somethingelse' secara tidak sengaja mengubah ciri cantuman kiri.

Apabila nilai dari sebelah kanan cantuman kiri (dalam kes ini, c.foobar) ialah termasuk dalam klausa WHERE, hanya baris dengan nilai NOT NULL disertakan dalam set hasil. Oleh itu, cantuman kiri berkesan berkelakuan seperti cantuman dalam, menghapuskan semua baris dengan nilai NULL untuk c.foobar.

Untuk mengekalkan gelagat yang dimaksudkan bagi cantuman kiri dalam contoh di atas, seseorang boleh menggunakan salah satu daripada yang berikut pendekatan:

  • Tulis semula klausa WHERE: Gantikan c.foobar = 'somethingelse' dengan syarat yang membenarkan nilai NULL, seperti AND (c.foobar = 'somethingelse' ATAU c.foobar IS NULL).
  • Alihkan penapis ke dalam predikat gabungan: Ubah suai klausa LEFT JOIN seperti berikut: LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'sesuatu yang lain'. Dengan meletakkan penapis dalam cantuman itu sendiri, gelagat cantuman kiri kekal tidak berubah, kerana nilai NULL dalam c.foobar masih dikekalkan.

Atas ialah kandungan terperinci Left Joins dan Klausa WHERE: Bagaimana Ia Berinteraksi, dan Bagaimana Saya Boleh Mengelakkan Keputusan Yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan