Odpowiedzi:
SQL jest oceniany wstecz, od prawej do lewej. Zatem klauzula where jest analizowana i szacowana przed klauzulą select. Z tego powodu aliasowanie nazwy u_nazwa_użytkownika jeszcze nie nastąpiło.
Zobacz następującą stronę podręcznika MySQL: http://dev.mysql.com/doc/refman/5.0/en/select.html
„Select_expr można nadać alias za pomocą AS alias_name. Alias jest używany jako nazwa kolumny wyrażenia i może być używany w klauzulach GROUP BY, ORDER BY lub HAVING.”
(...)
Niedopuszczalne jest odwoływanie się do aliasu kolumny w klauzuli WHERE, ponieważ wartość kolumny może nie zostać jeszcze określona podczas wykonywania klauzuli WHERE. Zobacz Sekcja B.5.4.4, „Problemy z aliasami kolumn”.
select u_name as user_name from users where u_name = "john";
Pomyśl o tym w ten sposób, Twoja klauzula where jest obliczana jako pierwsza, aby określić, które wiersze (lub połączone wiersze) mają zostać zwrócone. Po wykonaniu klauzuli where, klauzula select jest uruchamiana dla niej.
Ujmując to lepiej, wyobraź sobie to:
select distinct(u_name) as user_name from users where u_name = "john";
Nie możesz odwołać się do pierwszej połowy bez drugiej. Gdzie zawsze jest oceniany jako pierwszy, a następnie klauzula select.
Jeśli próbujesz wykonać zapytanie podobne do poniższego (znajdź wszystkie węzły z co najmniej jednym załącznikiem), w którym użyłeś instrukcji SELECT, aby utworzyć nowe pole, które faktycznie nie istnieje w bazie danych, i spróbuj użyć alias dla tego wyniku napotkasz ten sam problem:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
W klauzuli WHERE pojawi się błąd „Nieznana kolumna„ filecount ””.
Rozwiązanie jest właściwie dość proste - wystarczy zamienić alias na instrukcję, która tworzy alias, np .:
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;
Nadal otrzymasz zwrócony alias, ale teraz SQL nie powinien działać na nieznanym aliasie.
(
w zapytaniu dodatek, (COUNT(*)
który nie jest nigdzie zamknięty.
Zdefiniowane alias
przez WHERE
Ciebie nie są mile widziane przez klauzulę, w której musisz użyć HAVING
klauzuli
SELECT u_name AS user_name FROM users HAVING user_name = "john";
LUB możesz bezpośrednio użyć oryginalnej nazwy kolumny z rozszerzeniem WHERE
SELECT u_name AS user_name FROM users WHERE u_name = "john";
Tak samo, jak w przypadku wyniku w aliasie zdefiniowanym przez użytkownika w wyniku podzapytania lub dowolnego obliczenia, dostęp do niego będzie możliwy przez HAVING
klauzulę, a nie przezWHERE
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'
Zarówno:
SELECT u_name AS user_name
FROM users
WHERE u_name = "john";
lub:
SELECT user_name
from
(
SELECT u_name AS user_name
FROM users
)
WHERE u_name = "john";
Ten drugi powinien być taki sam jak pierwszy, jeśli RDBMS obsługuje wypychanie predykatów do widoku in-line.
poprawione:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
Nie, musisz go wybrać z poprawną nazwą. Jeśli podałeś tabelę, którą wybierzesz z aliasu, możesz tego użyć.
Nie, nie możesz. nazwa_użytkownika nie istnieje do czasu powrotu.
Nieznana kolumna w WHERE
klauzuli spowodowana liniami 1 i 2 i rozwiązana przez linię 3:
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
Może to pomoże.
Możesz
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
To działa.
ALE UPEWNIJ SIĘ, CO ROBISZ!
Ale może w niektórych przypadkach to pomaga
Chociaż możesz aliasować swoje tabele w zapytaniu (np. „SELECT u.username FROM users u;”), musisz użyć rzeczywistych nazw kolumn, do których się odnosisz. AS wpływa tylko na sposób zwracania pól.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Właśnie miałem ten problem.
Upewnij się, że w nazwie jednostki w bazie danych nie ma spacji.
np. „nazwa_użytkownika” zamiast „nazwa_użytkownika”
wypróbuj swoje zadanie używając warunku IN lub warunku OR , a także to zapytanie działa na spark-1.6.x
SELECT patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');
lub
SELECT patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';
Miałem ten sam problem, uznałem to za przydatne.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
pamiętaj, aby umieścić $ user w pojedynczych cudzysłowach.