Rumah >pangkalan data >tutorial mysql >Mengapa Saya Tidak Boleh Menggunakan Alias Lajur dalam Klausa MySQL WHERE?
Menghadapi ralat pertanyaan MySQL seperti #1054 - Unknown column 'guaranteed_postcode' in 'IN/ALL/ANY subquery'
? Ini biasanya berlaku apabila anda cuba menggunakan alias lajur (seperti guaranteed_postcode
dalam contoh di bawah) dalam klausa WHERE
.
Berikut ialah pertanyaan bermasalah:
<code class="language-sql">SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`, SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode` FROM `users` LEFT OUTER JOIN `locations` ON `users`.`id` = `locations`.`user_id` WHERE `guaranteed_postcode` NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>
Puncanya? Fasal WHERE
MySQL memproses sebelum klausa SELECT
, di mana alias ditakrifkan. Oleh itu, alias guaranteed_postcode
belum lagi dikenali semasa WHERE
pelaksanaan klausa.
Dokumentasi MySQL dengan jelas menyatakan bahawa alias lajur tidak dibenarkan dalam klausa WHERE
. Ini adalah had yang berpunca daripada susunan pelaksanaan pertanyaan.
Untuk menyelesaikan masalah ini, anda mempunyai dua pilihan utama:
SUBSTRING
terus dalam subquery klausa WHERE
:<code class="language-sql">SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`, SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode` FROM `users` LEFT OUTER JOIN `locations` ON `users`.`id` = `locations`.`user_id` WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>
HAVING
secara amnya kurang cekap untuk senario ini. HAVING
direka untuk menapis selepas pengagregatan, bukan untuk penapisan baris asas. Ia memerlukan penstrukturan semula pertanyaan. Rujuk sumber lain yang membandingkan WHERE
dan HAVING
untuk penjelasan terperinci.Untuk kes khusus ini, subkueri bersarang (pilihan 1) menyediakan penyelesaian yang lebih bersih dan lebih cekap. Ia menangani isu secara langsung dengan menggunakan pengiraan alias dalam skop klausa WHERE
. Elakkan daripada menggunakan HAVING
melainkan anda melakukan pengagregatan.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menggunakan Alias Lajur dalam Klausa MySQL WHERE?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!