Colonne inconnue dans la clause Where

J’ai une requête simple:

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

Unknown Column 'user_name' in where clause . Est-ce que je ne peux pas faire référence à 'user_name' dans d’autres parties de l’instruction même après avoir select 'u_name as user_name' ?

SQL est évalué en arrière, de droite à gauche. La clause where est donc analysée et évaluée avant la clause select. De ce fait, l’aliasing de nom_u sur nom_utilisateur n’a pas encore eu lieu.

Voir la page de manuel MySQL suivante: http://dev.mysql.com/doc/refman/5.0/en/select.html

“Un alias select_expr peut recevoir un alias en utilisant AS alias_name. L’alias est utilisé comme nom de colonne de l’expression et peut être utilisé dans les clauses GROUP BY, ORDER BY ou HAVING.”

(…)

Il est interdit de faire référence à un alias de colonne dans une clause WHERE, car la valeur de la colonne peut ne pas encore être déterminée lorsque la clause WHERE est exécutée. Voir Section B.5.4.4, «Problèmes avec les alias de colonne».

Qu’en est-il de:

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

Pensez à ceci, votre clause where évalue d’abord, pour déterminer quelles lignes (ou lignes jointes) doivent être retournées. Une fois la clause where exécutée, la clause select s’exécute pour cela.

Pour le dire mieux, imaginez ceci:

 select distinct(u_name) as user_name from users where u_name = "john"; 

Vous ne pouvez pas référencer la première moitié sans la seconde. Où est toujours évalué en premier, puis la clause select.

Si vous essayez d’effectuer une requête comme celle-ci (recherchez tous les nœuds avec au moins une pièce jointe) où vous avez utilisé une instruction SELECT pour créer un nouveau champ qui n’existe pas dans la firebase database et essayez d’utiliser l’alias de ce résultat vous posera le même problème:

 SELECT nodes.*, (SELECT (COUNT(*) FROM attachments WHERE attachments.nodeid = nodes.id) AS attachmentcount FROM nodes WHERE attachmentcount > 0; 

Vous obtiendrez une erreur “Colonne inconnue ‘attachmentcount’ dans la clause WHERE”.

La solution est en fait assez simple – remplacez simplement l’alias par l’instruction qui produit l’alias, par exemple:

 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; 

Vous obtiendrez toujours l’alias renvoyé, mais maintenant, SQL ne devrait pas fonctionner avec l’alias inconnu.

Non plus:

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

ou:

 SELECT user_name from ( SELECT u_name AS user_name FROM users ) WHERE u_name = "john"; 

Ce dernier devrait être le même que le premier si le SGBDR supporte les prédicats poussant dans la vue en ligne.

Vos alias définis ne sont pas les bienvenus avec la clause WHERE . Vous devez utiliser la clause HAVING pour cela.

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

OU vous pouvez directement utiliser le nom de colonne d’origine avec le WHERE

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

De même que vous avez le résultat dans un alias défini par l’utilisateur à la suite d’une sous-requête ou de tout calcul, la clause HAVING ne l’ WHERE pas par la 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' 

corrigée:

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

Non, vous devez le sélectionner avec le nom correct. Si vous avez donné à la table que vous sélectionnez un alias, vous pouvez l’utiliser.

Non tu ne peux pas. user_name n’existe pas avant l’heure de retour.

Colonne inconnue dans la clause WHERE provoquée par les lignes 1 et 2 et résolue par la ligne 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."'";

Peut-être que ça aide.

Vous pouvez

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

Ça marche.

Mais assurez-vous que vous faites!

  • Les index ne sont pas utilisés ici
  • Il y aura une parsing FULL TABLE – vous n’avez pas spécifié la partie LIMIT 1
  • Donc, – CETTE DEMANDE SERA SITUEE SUR DE GRANDES TABLEAUX.

Mais, cela peut être utile dans certains cas

J’ai eu le même problème, j’ai trouvé cela utile.

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

N’oubliez pas de mettre $ user dans des guillemets simples.

Juste eu ce problème.

Assurez-vous qu’il n’y a pas d’espace dans le nom de l’entité dans la firebase database.

par exemple ‘nom_utilisateur’ au lieu de ‘nom_utilisateur’

Bien que vous puissiez alias vos tables dans votre requête (c.-à-d. “SELECT u.username FROM utilisateurs u;”), vous devez utiliser les noms réels des colonnes que vous référencez. AS n’affecte que la manière dont les champs sont renvoyés.

Pas autant que je sache dans MS-SQL 2000/5. Je suis tombé sous le coup de cela par le passé.

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

Essayez votre tâche en utilisant la condition IN ou la condition OR et cette requête fonctionne également sur spark-1.6.x

  SELECT patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3'); 

ou

 SELECT patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';