Maison > base de données > tutoriel mysql > Pourquoi ne puis-je pas utiliser un alias de colonne dans une clause MySQL WHERE ?

Pourquoi ne puis-je pas utiliser un alias de colonne dans une clause MySQL WHERE ?

Barbara Streisand
Libérer: 2025-01-22 08:17:13
original
290 Les gens l'ont consulté

Why Can't I Use a Column Alias in a MySQL WHERE Clause?

La clause MySQL WHERE n'autorise pas les alias de colonnes : explication de l'erreur

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 :

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')
)
Copier après la connexion

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.

Clarification de la documentation MySQL :

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.

Solution : sous-requête ou clause HAVING

Pour résoudre ce problème, vous avez deux options principales :

  1. Sous-requête imbriquée : Intégrez la fonction SUBSTRING directement dans la sous-requête de la clause WHERE :
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')
)
Copier après la connexion
  1. Clause HAVING (moins efficace) : Bien que possible, l'utilisation de 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.

Choisir la bonne approche :

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal