Risposte:
SQL viene valutato al contrario, da destra a sinistra. Quindi la clausola where viene analizzata e valutata prima della clausola select. Per questo motivo l'aliasing di u_name su user_name non è ancora avvenuto.
Vedere la seguente pagina di manuale di MySQL: http://dev.mysql.com/doc/refman/5.0/en/select.html
"A select_expr può essere assegnato un alias utilizzando AS alias_name. L'alias viene utilizzato come nome della colonna dell'espressione e può essere utilizzato nelle clausole GROUP BY, ORDER BY o HAVING."
(...)
Non è consentito fare riferimento a un alias di colonna in una clausola WHERE, poiché il valore della colonna potrebbe non essere ancora determinato quando viene eseguita la clausola WHERE. Vedere la sezione B.5.4.4, "Problemi con gli alias di colonna".
select u_name as user_name from users where u_name = "john";
Pensala in questo modo, la clausola where viene valutata per prima, per determinare quali righe (o righe unite) devono essere restituite. Una volta eseguita la clausola where, viene eseguita la clausola select.
Per dirla in modo migliore, immagina questo:
select distinct(u_name) as user_name from users where u_name = "john";
Non puoi fare riferimento alla prima metà senza la seconda. Dove viene sempre valutato prima, quindi la clausola select.
Se si sta tentando di eseguire una query come la seguente (trovare tutti i nodi con almeno un allegato) in cui è stata utilizzata un'istruzione SELECT per creare un nuovo campo che in realtà non esiste nel database e provare a utilizzare l'alias per quel risultato ti imbatterai nello stesso problema:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
Verrà visualizzato un messaggio di errore "Colonna sconosciuta" allegato conteggio "nella clausola WHERE".
La soluzione è in realtà abbastanza semplice: basta sostituire l'alias con l'affermazione che produce l'alias, ad esempio:
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;
Otterrai comunque restituito l'alias, ma ora SQL non dovrebbe superare l'alias sconosciuto.
(
nella tua query prima (COUNT(*)
che non sia chiusa da nessuna parte.
Il tuo definito alias
non è accolto favorevolmente dalla WHERE
clausola che devi usare la HAVING
clausola per questo
SELECT u_name AS user_name FROM users HAVING user_name = "john";
O è possibile utilizzare direttamente il nome della colonna originale con il WHERE
SELECT u_name AS user_name FROM users WHERE u_name = "john";
Come nel caso in cui il risultato sia un alias definito dall'utente a seguito di una query secondaria o di qualsiasi calcolo a cui accederà dalla HAVING
clausola e non dalWHERE
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'
O:
SELECT u_name AS user_name
FROM users
WHERE u_name = "john";
o:
SELECT user_name
from
(
SELECT u_name AS user_name
FROM users
)
WHERE u_name = "john";
Il secondo dovrebbe essere lo stesso del primo se RDBMS supporta il predicato spingendo nella vista in linea.
corretto:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
No, è necessario selezionarlo con il nome corretto. Se hai dato la tabella selezionata da un alias, puoi comunque usarla.
No, non puoi. user_name is non esiste fino al tempo di ritorno.
Colonna sconosciuta nella WHERE
clausola causata dalle righe 1 e 2 e risolta dalla riga 3:
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
Può essere d'aiuto.
Puoi
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
Funziona.
MA ASSICURATI CHE COSA FARE!
Ma potrebbe essere utile in alcuni casi
Mentre puoi aliasare le tue tabelle all'interno della tua query (es. "SELEZIONAnomeutente DA utenti u;"), devi usare i nomi effettivi delle colonne a cui fai riferimento. AS influisce solo sulla modalità di restituzione dei campi.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Ho appena avuto questo problema.
Assicurarsi che non vi sia spazio nel nome dell'entità nel database.
ad es. "nome_utente" anziché "nome_utente"
prova la tua attività usando la condizione IN o la condizione OR e anche questa query funziona su spark-1.6.x
SELECT patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');
o
SELECT patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';
Ho avuto lo stesso problema, l'ho trovato utile.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
ricordati di mettere $ user tra virgolette singole.