La requête que j'exécute est la suivante, mais j'obtiens cette erreur:
# 1054 - Colonne inconnue 'Guarante_postcode' dans 'IN / ALL / ANY subquery'
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 #this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
Ma question est: pourquoi ne puis-je pas utiliser une fausse colonne dans la clause where de la même requête DB?
la source
HAVING
s'exécute plus lentement queWHERE
having
est que les valeurs des colonnes doivent être calculées au moment où vous accédez à lahaving
. Ce n'est pas le caswhere
, comme indiqué ci-dessus.Comme l'a souligné Victor, le problème vient de l'alias. Cela peut être évité cependant, en plaçant l'expression directement dans la clause WHERE x IN y:
Cependant, je suppose que cela est très inefficace, car la sous-requête doit être exécutée pour chaque ligne de la requête externe.
la source
SQL standard (ou MySQL) n'autorise pas l'utilisation d'alias de colonne dans une clause WHERE car
(à partir de la documentation MySQL ). Ce que vous pouvez faire est de calculer la valeur de la colonne dans la clause WHERE , d'enregistrer la valeur dans une variable et de l'utiliser dans la liste des champs. Par exemple, vous pouvez faire ceci:
Cela évite de répéter l'expression lorsqu'elle se complique, ce qui facilite la maintenance du code.
la source
select @code:=sum(2), 2*@code
fonctionne dans MySQL 5.5, mais pour moi dans 5.6 la deuxième colonne donne NULL lors de la première invocation, et retourne 2 fois le résultat précédent lors d'une nouvelle exécution. Assez intéressant, les deux sélectionnent@code:=2, 2*@code
etselect @code:=rand(), 2*@code
semblent fonctionner dans ma version 5.6 (aujourd'hui). Mais ceux-ci sont en effet en train d'écrire et de lire dans la clause SELECT; dans votre cas, vous le placez où.Ma réponse est peut-être trop tard, mais cela peut aider les autres.
Vous pouvez le joindre à une autre instruction select et utiliser la clause where.
calcAlias est la colonne d'alias qui a été calculée.
la source
Vous pouvez utiliser la clause HAVING pour le filtre calculé dans les champs SELECT et les alias
la source
WHERE
etHAVING
cependant. Ils ne sont pas identiques. stackoverflow.com/search?q=where+vs+havingJ'utilise mysql 5.5.24 et le code suivant fonctionne:
la source
SQL standard interdit les références aux alias de colonne dans une clause WHERE. Cette restriction est imposée car lorsque la clause WHERE est évaluée, la valeur de la colonne n'a peut-être pas encore été déterminée. Par exemple, la requête suivante est illégale:
SELECT id, COUNT (*) AS cnt FROM tbl_name WHERE cnt> 0 GROUP BY id;
la source
Vous pouvez utiliser SUBSTRING (
locations
.raw
, -6,4) pour savoir où conditonla source