Colonna sconosciuta in Where Clausola

Ho una query semplice:

SELECT u_name AS user_name FROM users WHERE user_name = "john"; 

Prendo la Unknown Column 'user_name' in where clause . Non posso fare riferimento a 'user_name' in altre parti select 'u_name as user_name' anche dopo aver select 'u_name as user_name' ?

SQL viene valutato all’indietro, da destra a sinistra. Quindi la clausola where viene analizzata e valutata prima della clausola select. Per questo motivo l’alias di u_name in user_name non si è ancora verificato.

Vedere la seguente pagina del manuale MySQL: http://dev.mysql.com/doc/refman/5.0/en/select.html

“A select_expr può essere assegnato un alias usando AS nome_alias. 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 delle colonne”.

Che dire:

 SELECT u_name AS user_name FROM users HAVING user_name = "john"; 
 select u_name as user_name from users where u_name = "john"; 

Pensa in questo modo, la clausola where valuta per prima cosa, 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 al primo semestre senza il secondo. Dove viene sempre valutato prima, quindi la clausola select.

Se stai tentando di eseguire una query come la seguente (trova tutti i nodes con almeno un allegato) in cui hai usato un’istruzione SELECT per creare un nuovo campo che non esiste realmente nel database e prova ad usare 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; 

Riceverai un messaggio di errore “Conto colonna sconosciuto” nella clausola WHERE “.

La soluzione è in realtà abbastanza semplice: basta sostituire l’alias con l’istruzione 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 l’alias restituito, ma ora SQL non dovrebbe eseguire il bork sull’alias sconosciuto.

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"; 

Quest’ultimo dovrebbe essere lo stesso del primo se l’RDBMS supporta il push del predicato nella vista in linea.

Il tuo alias definito non è accolto dalla clausola WHERE per utilizzare la clausola HAVING

 SELECT u_name AS user_name FROM users HAVING user_name = "john"; 

O puoi usare direttamente il nome della colonna originale con WHERE

 SELECT u_name AS user_name FROM users WHERE u_name = "john"; 

Come se avessi il risultato in alias definiti dall’utente a seguito di sottoquery o qualsiasi calcolo a cui accederà dalla clausola HAVING non dal WHERE

 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' 

corretto:

 SELECT u_name AS user_name FROM users WHERE u_name = 'john'; 

No, devi selezionarlo con il nome corretto. Se hai dato la tabella selezionata da un alias, puoi comunque utilizzarla.

No, non puoi. user_name non esiste fino al momento del ritorno.

Colonna sconosciuta nella clausola WHERE causata dalle righe 1 e 2 e risolta dalla riga 3:

  1. $sql = "SELECT * FROM users WHERE username =".$userName;
  2. $sql = "SELECT * FROM users WHERE username =".$userName."";
  3. $sql = "SELECT * FROM users WHERE username ='".$userName."'";

Potrebbe essere utile.

Puoi

 SET @somevar := ''; SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john"; 

Funziona.

MA ASSICURI COSA FACCIA!

  • Gli indici NON sono UTILIZZATI qui
  • Verrà eseguita la scansione della TABELLA COMPLETA: non è stata specificata la parte LIMIT 1
  • Quindi, QUESTA QUERY SARA ‘SLLLOOOOOOW su tavoli enormi.

Ma potrebbe essere utile in alcuni casi

Ho avuto lo stesso problema, ho trovato questo utile.

 mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'"); 

ricorda di mettere $ utente tra virgolette singole.

Ho appena avuto questo problema.

Assicurarsi che non vi sia spazio nel nome dell’ quadro nel database.

ad es. “nome_utente” invece di “nome_utente”

Mentre puoi fare l’alias delle tue tabelle all’interno della tua query (es. “SELECT u.username FROM users u;”), devi usare i nomi effettivi delle colonne a cui stai facendo riferimento. AS impatta solo come vengono restituiti i campi.

Non per quanto ne so in MS-SQL 2000/5. Sono caduto in fallo in passato.

 SELECT user_name FROM ( SELECT name AS user_name FROM users ) AS test WHERE user_name = "john" 

prova la tua attività utilizzando la condizione IN o OR e anche questa query sta funzionando 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';