Heim >Datenbank >MySQL-Tutorial >Warum kann ich in einer MySQL-WHERE-Klausel keinen Spaltenalias verwenden?
Stößt du auf einen MySQL-Abfragefehler wie #1054 - Unknown column 'guaranteed_postcode' in 'IN/ALL/ANY subquery'
? Dies geschieht normalerweise, wenn Sie versuchen, einen Spaltenalias (wie guaranteed_postcode
im Beispiel unten) innerhalb der WHERE
-Klausel zu verwenden.
Hier ist die problematische Abfrage:
<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>
Die Grundursache? Die WHERE
-Klausel von MySQL verarbeitet vor der SELECT
-Klausel, in der Aliase definiert werden. Daher wird der Alias guaranteed_postcode
während der Ausführung der WHERE
-Klausel noch nicht erkannt.
In der MySQL-Dokumentation heißt es eindeutig, dass Spaltenaliase in WHERE
-Klauseln nicht zulässig sind. Dies ist eine Einschränkung, die sich aus der Reihenfolge der Abfrageausführung ergibt.
Um dieses Problem zu beheben, haben Sie zwei Hauptoptionen:
SUBSTRING
direkt in die Unterabfrage der WHERE
-Klausel ein:<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
für dieses Szenario im Allgemeinen weniger effizient. HAVING
ist für die Filterung nach der Aggregation konzipiert, nicht für die einfache Zeilenfilterung. Es würde eine Umstrukturierung der Abfrage erfordern. Ausführliche Erläuterungen finden Sie in anderen Ressourcen, in denen WHERE
und HAVING
verglichen werden.Für diesen speziellen Fall bietet die verschachtelte Unterabfrage (Option 1) eine sauberere und effizientere Lösung. Es geht das Problem direkt an, indem es die Aliasberechnung im Rahmen der WHERE
-Klausel anwendet. Vermeiden Sie die Verwendung von HAVING
, es sei denn, Sie führen Aggregationen durch.
Das obige ist der detaillierte Inhalt vonWarum kann ich in einer MySQL-WHERE-Klausel keinen Spaltenalias verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!