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'
?
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.
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 ».
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-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.
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.
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.
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'
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.
corrigée:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
Non vous ne pouvez pas. nom_utilisateur n'existe pas jusqu'à 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:
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
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"
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!
Mais, peut-être que cela aide dans certains cas
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
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.
Pas autant que je sache dans MS-SQL 2000/5. Je suis tombé en faute dans le passé.
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.
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';