Menyelesaikan masalah SQL WHERE Klausa: Mengapa Parameter Diabaikan
Pertanyaan SQL kadangkala boleh menghasilkan hasil yang tidak dijangka, terutamanya apabila klausa WHERE
menggabungkan berbilang syarat. Ini selalunya berpunca daripada keutamaan dan pengelompokan operator yang salah.
Mari kita periksa senario di mana klausa WHERE
nampaknya mengabaikan parameter:
SELECT * FROM people WHERE university='2' AND MATCH (lname,fname) AGAINST ('+massive' IN BOOLEAN MODE) OR (fname LIKE '%box%' OR lname LIKE '%box%')
Pertanyaan ini bertujuan untuk memilih rekod daripada jadual people
dengan university
ialah '2' dan carian teks penuh untuk padanan 'besar' atau yang pertama atau nama akhir mengandungi 'kotak'. Walau bagaimanapun, set hasil mungkin termasuk entri yang tidak memenuhi syarat university='2'
.
Masalahnya terletak pada keutamaan pengendali SQL: AND
diutamakan daripada OR
. Pengumpulan tersirat pertanyaan ialah:
(university='2') AND ( (MATCH (lname,fname) AGAINST ('+massive' IN BOOLEAN MODE)) OR (fname LIKE '%box%' OR lname LIKE '%box%') )
Perhatikan bagaimana university='2'
hanya digunakan pada carian teks penuh. Untuk membetulkannya, kami memerlukan kurungan eksplisit untuk memastikan syarat AND
terpakai pada semua bahagian:
SELECT * FROM people WHERE (university='2') AND (MATCH (lname,fname) AGAINST ('+massive' IN BOOLEAN MODE) OR fname LIKE '%box%' OR lname LIKE '%box%')
Dengan mengumpulkan semua syarat dalam kurungan, kami menguatkuasakan logik yang dimaksudkan, memastikan hanya rekod yang memenuhi semua kriteria yang ditentukan dikembalikan. Ini menyerlahkan kepentingan penggunaan kurungan yang teliti semasa membina fasal WHERE
kompleks dalam SQL.
Atas ialah kandungan terperinci Mengapa Klausa SQL WHERE Saya Mengabaikan Parameter?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!