Réponses:
SQL est évalué à l'envers, de droite à gauche. Ainsi, la clause where est analysée et évaluée avant la clause select. Pour cette raison, l'alias de u_name en user_name n'a pas encore eu lieu.
Consultez la page de manuel MySQL suivante: http://dev.mysql.com/doc/refman/5.0/en/select.html
«Un alias peut être attribué à une exp_sélection en utilisant AS nom_alias. 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 n'est pas permis 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».
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 elle.
Pour mieux dire, 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ù 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 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 - 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 s'embarrasser de l'alias inconnu.
(
dans votre requête avant le (COUNT(*)
qui n'est fermé nulle part.
Votre définition alias
n'est pas accueillie par la WHERE
clause que vous devez utiliser la HAVING
clause pour cela
SELECT u_name AS user_name FROM users HAVING user_name = "john";
OU vous pouvez utiliser directement le nom de la colonne d'origine avec le WHERE
SELECT u_name AS user_name FROM users WHERE u_name = "john";
Comme vous avez le résultat dans un alias défini par l'utilisateur à la suite d'une sous-requête ou de tout calcul, il sera accessible par la HAVING
clause et non par leWHERE
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'
Soit:
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 prend en charge la poussée de prédicat dans la vue en ligne.
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 à partir d'un alias, vous pouvez l'utiliser.
Non tu ne peux pas. nom_utilisateur n'existe pas avant l'heure de retour.
Colonne inconnue dans la WHERE
clause causé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."'";
Peut-être que cela aide.
Vous pouvez
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
Ça marche.
MAIS ASSUREZ-VOUS DE CE QUE VOUS FAITES!
Mais, peut-être que cela aide dans certains cas
Alors que vous pouvez alias vos tables dans votre requête (par exemple, "SELECT u.username FROM users u;"), vous devez utiliser les noms réels des colonnes que vous référencez. AS affecte uniquement la manière dont les champs sont renvoyés.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
J'ai 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'
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';
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 entre '' guillemets simples.