Antworten:
SQL wird von rechts nach links rückwärts ausgewertet. Daher wird die where-Klausel vor der select-Klausel analysiert und ausgewertet. Aus diesem Grund ist das Aliasing von u_name zu user_name noch nicht aufgetreten.
Siehe die folgende MySQL-Handbuchseite: http://dev.mysql.com/doc/refman/5.0/de/select.html
"Ein select_expr kann mit AS alias_name einen Alias erhalten. Der Alias wird als Spaltenname des Ausdrucks verwendet und kann in GROUP BY-, ORDER BY- oder HAVING-Klauseln verwendet werden."
(...)
Es ist nicht zulässig, in einer WHERE-Klausel auf einen Spaltenalias zu verweisen, da der Spaltenwert bei der Ausführung der WHERE-Klausel möglicherweise noch nicht ermittelt wurde. Siehe Abschnitt B.5.4.4, „Probleme mit Spaltenaliasen“.
select u_name as user_name from users where u_name = "john";
Stellen Sie sich das so vor: Ihre where-Klausel wird zuerst ausgewertet, um zu bestimmen, welche Zeilen (oder verknüpften Zeilen) zurückgegeben werden müssen. Sobald die where-Klausel ausgeführt wurde, wird die select-Klausel ausgeführt.
Um es besser auszudrücken, stellen Sie sich Folgendes vor:
select distinct(u_name) as user_name from users where u_name = "john";
Sie können die erste Hälfte nicht ohne die zweite referenzieren. Wo immer zuerst ausgewertet wird, dann die select-Klausel.
Wenn Sie versuchen, eine Abfrage wie die folgende durchzuführen (suchen Sie alle Knoten mit mindestens einem Anhang), bei der Sie eine SELECT-Anweisung verwendet haben, um ein neues Feld zu erstellen, das in der Datenbank nicht vorhanden ist, und versuchen Sie es zu verwenden Der Alias für dieses Ergebnis wird auf dasselbe Problem stoßen:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
Sie erhalten die Fehlermeldung "Unbekannte Spalte 'Anhangsanzahl' in WHERE-Klausel".
Die Lösung ist eigentlich ziemlich einfach - ersetzen Sie einfach den Alias durch die Anweisung, die den Alias erzeugt, z.
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE (SELECT (COUNT(*) FROM attachments WHERE attachments.nodeid = nodes.id) > 0;
Der Alias wird weiterhin zurückgegeben, aber jetzt sollte SQL den unbekannten Alias nicht mehr stören.
(
in Ihrer Anfrage, bevor das (COUNT(*)
nirgendwo geschlossen wird.
Ihr definiert alias
werden nicht durch die begrüßt WHERE
Klausel haben Sie die verwenden HAVING
Klausel für diese
SELECT u_name AS user_name FROM users HAVING user_name = "john";
ODER Sie können den ursprünglichen Spaltennamen direkt mit dem verwenden WHERE
SELECT u_name AS user_name FROM users WHERE u_name = "john";
Genauso wie Sie das Ergebnis in einem benutzerdefinierten Alias als Ergebnis einer Unterabfrage oder einer Berechnung haben, wird auf die HAVING
Klausel zugegriffen , nicht auf dieWHERE
SELECT u_name AS user_name ,
(SELECT last_name FROM users2 WHERE id=users.id) as user_last_name
FROM users WHERE u_name = "john" HAVING user_last_name ='smith'
Entweder:
SELECT u_name AS user_name
FROM users
WHERE u_name = "john";
oder:
SELECT user_name
from
(
SELECT u_name AS user_name
FROM users
)
WHERE u_name = "john";
Letzteres sollte mit Ersterem identisch sein, wenn das RDBMS das Verschieben von Prädikaten in die Inline-Ansicht unterstützt.
korrigiert:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
Nein, Sie müssen es mit dem richtigen Namen auswählen. Wenn Sie die Tabelle angegeben haben, die Sie aus einem Alias ausgewählt haben, können Sie dies jedoch verwenden.
Nein, du kannst nicht. Benutzername ist erst nach der Rückgabe vorhanden.
Unbekannte Spalte in WHERE
Klausel, verursacht durch die Zeilen 1 und 2 und behoben durch Zeile 3:
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
Vielleicht hilft es.
Sie können
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
Es klappt.
ABER STELLEN SIE SICHER, WAS SIE TUN!
Aber vielleicht hilft es in einigen Fällen
Während Sie Ihre Tabellen in Ihrer Abfrage aliasen können (dh "SELECT u.username FROM users u;"), müssen Sie die tatsächlichen Namen der Spalten verwenden, auf die Sie verweisen. AS wirkt sich nur darauf aus, wie die Felder zurückgegeben werden.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Hatte gerade dieses Problem.
Stellen Sie sicher, dass der Name der Entität in der Datenbank kein Leerzeichen enthält.
zB 'Benutzername' anstelle von 'Benutzername'
Versuchen Sie Ihre Aufgabe mit der IN- Bedingung oder der OR- Bedingung, und auch diese Abfrage funktioniert mit spark-1.6.x
SELECT patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');
oder
SELECT patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';
Ich hatte das gleiche Problem, ich fand das nützlich.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
Denken Sie daran, $ user in einfache Anführungszeichen zu setzen.