Rumah >pangkalan data >tutorial mysql >Mengapa Saya Tidak Boleh Menggunakan Alias ​​Lajur dalam Klausa MySQL WHERE?

Mengapa Saya Tidak Boleh Menggunakan Alias ​​Lajur dalam Klausa MySQL WHERE?

Barbara Streisand
Barbara Streisandasal
2025-01-22 08:17:13219semak imbas

Why Can't I Use a Column Alias in a MySQL WHERE Clause?

MySQL WHERE Klausa Tidak Membenarkan Alias ​​Lajur: Ralat Diterangkan

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.

Penjelasan Dokumentasi MySQL:

Dokumentasi MySQL dengan jelas menyatakan bahawa alias lajur tidak dibenarkan dalam klausa WHERE. Ini adalah had yang berpunca daripada susunan pelaksanaan pertanyaan.

Penyelesaian: Subkueri atau Klausa HAVING

Untuk menyelesaikan masalah ini, anda mempunyai dua pilihan utama:

  1. Subquery Bersarang: Benamkan fungsi 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>
  1. MENDAPAT Klausa (Kurang Cekap): Walaupun boleh, menggunakan 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.

Memilih Pendekatan yang Betul:

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!

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