Maison >base de données >tutoriel mysql >Pourquoi ne puis-je pas utiliser un alias de colonne dans une clause MySQL WHERE ?
Vous rencontrez une erreur de requête MySQL comme #1054 - Unknown column 'guaranteed_postcode' in 'IN/ALL/ANY subquery'
? Cela se produit généralement lorsque vous essayez d'utiliser un alias de colonne (comme guaranteed_postcode
dans l'exemple ci-dessous) dans la clause WHERE
.
Voici la requête problématique :
<code class="language-sql">SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`, SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode` FROM `users` LEFT OUTER JOIN `locations` ON `users`.`id` = `locations`.`user_id` WHERE `guaranteed_postcode` NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>
La cause profonde ? La clause WHERE
de MySQL traite avant la clause SELECT
, où les alias sont définis. Par conséquent, l'alias guaranteed_postcode
n'est pas encore reconnu lors de l'exécution de la clause WHERE
.
La documentation MySQL indique clairement que les alias de colonnes ne sont pas autorisés dans les clauses WHERE
. Il s'agit d'une limitation découlant de l'ordre d'exécution des requêtes.
Pour résoudre ce problème, vous avez deux options principales :
SUBSTRING
directement dans la sous-requête de la clause WHERE
:<code class="language-sql">SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`, SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode` FROM `users` LEFT OUTER JOIN `locations` ON `users`.`id` = `locations`.`user_id` WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>
HAVING
est généralement moins efficace pour ce scénario. HAVING
est conçu pour le filtrage après l'agrégation, pas pour le filtrage de lignes de base. Cela nécessiterait de restructurer la requête. Reportez-vous à d'autres ressources comparant WHERE
et HAVING
pour des explications détaillées.Pour ce cas précis, la sous-requête imbriquée (option 1) offre une solution plus propre et plus efficace. Il résout directement le problème en appliquant le calcul de l'alias dans le champ d'application de la clause WHERE
. Évitez d'utiliser HAVING
sauf si vous effectuez des agrégations.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!