Maison >base de données >tutoriel mysql >Pourquoi ne puis-je pas utiliser un alias de colonne dans une sous-requête de clause WHERE MySQL ?
Sous-requête de clause MySQL WHERE : problème d'alias de colonne et solution
L'utilisation d'un alias de colonne dans une sous-requête de clause MySQL WHERE
entraîne souvent des erreurs telles que "#1054 - Colonne inconnue 'code postal_garanti' dans 'sous-requête IN/ALL/ANY'." Cela résulte de la tentative de filtrer les résultats en fonction d'un alias (guaranteed_postcode
dans ce cas) avant qu'il ne soit réellement défini par la requête.
Scénario de problème :
Le scénario typique implique une requête joignant des tables (par exemple, « utilisateurs » et « emplacements ») et créant une nouvelle colonne (comme guaranteed_postcode
à partir d'une sous-chaîne de la colonne « brute »). La tentative ultérieure de filtrage à l'aide de cet alias nouvellement créé dans une sous-requête de clause WHERE
échoue.
Pourquoi ça échoue :
MySQL traite la clause WHERE
avant de résoudre les alias. Par conséquent, l'alias guaranteed_postcode
est inconnu au moment de l'exécution de la clause WHERE
. Cette limitation est conforme aux normes SQL.
Conformité aux normes SQL :
MySQL, adhérant aux normes SQL, restreint l'utilisation d'alias de colonne dans les clauses WHERE
. Les alias sont correctement utilisés dans les clauses GROUP BY
, ORDER BY
et HAVING
.
Solution efficace utilisant HAVING :
La solution recommandée consiste à utiliser la clause HAVING
. HAVING
est conçu pour filtrer les données agrégées, mais il peut gérer efficacement cette situation. Voici comment réécrire la requête :
<code class="language-sql">HAVING `guaranteed_postcode` NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>
Cette approche garantit que l'alias guaranteed_postcode
est évalué après la création de la colonne, résolvant ainsi l'erreur. La clause HAVING
filtre correctement les résultats en fonction de la condition souhaitée.
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!