web-dev-qa-db-fra.com

Colonne inconnue dans la clause Where

J'ai une requête simple:

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

Je reçois Unknown Column 'user_name' in where clause. Puis-je ne pas faire référence à 'user_name' dans d'autres parties de l'instruction même après select 'u_name as user_name'?

98
Corpo

SQL est évalué à l'envers, de droite à gauche. Ainsi, la clause where est analysée et évaluée avant la clause select. C'est pour cette raison que l'aliasing de u_name à user_name n'a pas encore eu lieu.

76
dacracot

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

"Un pseudonyme Peut être attribué à select_expr avec AS alias_name. L'alias est utilisé Le nom de colonne de l'expression et Peuvent être utilisés dans les clauses GROUP BY, ORDER BY ou HAVING."

(...)

Il n'est pas permis de faire référence à un alias de colonne dans une clause WHERE, parce que la valeur de la colonne peut ne pas encore être déterminée quand WHERE la clause est exécutée. See Section B.5.4.4, «Problèmes de colonne Alias ​​».

31
Paul Dixon

Qu'en est-il de:

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

Pensez-y comme ceci: votre clause where est évaluée en premier pour déterminer quelles lignes (ou lignes jointes) doivent être renvoyées. Une fois la clause where exécutée, la clause select s’exécute.

Pour le dire mieux, imaginez ceci:

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

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

12
Mark S.

Si vous essayez d'effectuer une requête comme celle-ci (recherchez tous les nœuds avec au moins une pièce jointe) pour laquelle vous avez utilisé une instruction SELECT pour créer un nouveau champ qui n'existe pas réellement dans la base de données, et essayez d'utiliser l'alias pour ce résultat, vous rencontrerez 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 - il suffit de remplacer 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 le pseudonyme retourné, mais SQL ne devrait plus utiliser l'alias inconnu.

10
Jon

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 doit être identique au premier si le SGBDR prend en charge la transmission des prédicats dans la vue en ligne.

6
David Aldridge

Les alias définis ne sont pas acceptés par la clause WHERE. Vous devez utiliser la clause HAVING pour cette 

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

OU vous pouvez directement utiliser le nom de la colonne d'origine avec la variable WHERE

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

Identique au résultat obtenu en tant que pseudonyme défini par l'utilisateur à la suite d'une sous-requête ou de tout calcul auquel la clause HAVING y aura accès, et non la variable 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'
6
M Khalid Junaid

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.

5

corrigée:

SELECT u_name AS user_name FROM users WHERE u_name = 'john';
5
Steven A. Lowe

Non vous ne pouvez pas. nom_utilisateur n'existe pas jusqu'à l'heure de retour.

3
Jarrett Meyer

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."'";
2
oliyide

Juste eu ce problème.

Assurez-vous qu'il n'y a pas d'espace dans le nom de l'entité dans la base de données.

par exemple. "nom_utilisateur" au lieu de "nom_utilisateur" 

1
user3103155

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 CE QUE VOUS FAITES!

  • Les index ne sont pas utilisés ici
  • FULL TABLE sera numérisé - vous n'avez pas spécifié la partie LIMIT 1
  • Donc, - CETTE QUESTION SERA SLLLOOOOOOW sur d’énormes tables.

Mais, peut-être que cela aide dans certains cas

1
F_S
SELECT user_name
FROM
(
SELECT name AS user_name
FROM   users
) AS test
WHERE  user_name = "john"
0
Foripepe

Bien que vous puissiez créer un alias pour vos tables dans votre requête (c'est-à-dire, "SELECT u.username FROM users u;"), vous devez utiliser les noms réels des colonnes que vous référencez. AS affecte uniquement la façon dont les champs sont retournés.

0
Blumer

Pas autant que je sache dans MS-SQL 2000/5. Je suis tombé en faute dans le passé.

0
Cirieno

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

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

souvenez-vous de mettre $ user entre guillemets simples.

0
devWaleed

essayez votre tâche en utilisantDANScondition ouOUcondition 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';
0
KARTHIKEYAN.A