Die Abfrage, die ich ausführe, lautet wie folgt, es wird jedoch folgende Fehlermeldung angezeigt:
# 1054 - Unbekannte Spalte 'garantierter Postleitzahl' in 'IN / ALL / ANY-Unterabfrage'
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 #this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
Meine Frage lautet: Warum kann ich keine gefälschte Spalte in der where-Klausel derselben DB-Abfrage verwenden?
quelle
HAVING
langsamer ausgeführt alsWHERE
having
ist, dass die Spaltenwerte bis zum Erreichen des berechnet werden müssenhaving
. Dies ist nicht der Fallwhere
, wie oben angegeben.Wie Victor betonte, liegt das Problem beim Alias. Dies kann jedoch vermieden werden, indem der Ausdruck direkt in die WHERE x IN y-Klausel eingefügt wird:
Ich denke jedoch, dass dies sehr ineffizient ist, da die Unterabfrage für jede Zeile der äußeren Abfrage ausgeführt werden muss.
quelle
Standard SQL (oder MySQL) erlaubt die Verwendung von Spaltenaliasnamen in einer WHERE-Klausel nicht, weil
(aus der MySQL-Dokumentation ). Sie können den Spaltenwert in der WHERE- Klausel berechnen , den Wert in einer Variablen speichern und in der Feldliste verwenden. Zum Beispiel könnten Sie dies tun:
Dadurch wird vermieden, dass der Ausdruck wiederholt wird, wenn er kompliziert wird, wodurch der Code einfacher zu warten ist.
quelle
select @code:=sum(2), 2*@code
in MySQL 5.5 funktioniert, aber für mich in 5.6 ergibt die zweite Spalte beim ersten Aufruf NULL und gibt beim erneuten Ausführen das Zweifache des vorherigen Ergebnisses zurück. Interessant genug, beide wählen@code:=2, 2*@code
undselect @code:=rand(), 2*@code
scheinen in meinem 5.6 (heute) zu funktionieren. Aber diese schreiben und lesen tatsächlich in der SELECT-Klausel; In Ihrem Fall setzen Sie es in WHERE.Vielleicht ist meine Antwort zu spät, aber das kann anderen helfen.
Sie können es einer anderen select-Anweisung hinzufügen und die where-Klausel verwenden.
calcAlias ist die Alias-Spalte, die berechnet wurde.
quelle
Sie können die HAVING-Klausel für Filter verwenden, die in SELECT-Feldern und Aliasen berechnet werden
quelle
WHERE
undHAVING
. Sie sind nicht identisch. stackoverflow.com/search?q=where+vs+havingIch verwende MySQL 5.5.24 und der folgende Code funktioniert:
quelle
Standard-SQL erlaubt keine Verweise auf Spaltenaliasnamen in einer WHERE-Klausel. Diese Einschränkung wird auferlegt, da bei der Auswertung der WHERE-Klausel der Spaltenwert möglicherweise noch nicht ermittelt wurde. Die folgende Abfrage ist beispielsweise unzulässig:
SELECT id, COUNT (*) AS cnt FROM tbl_name WHERE cnt> 0 GROUP BY id;
quelle
Sie können SUBSTRING (
locations
.raw
, -6,4) für die Bedingung verwendenquelle