Dans MySQL, les variables temporaires peuvent-elles être utilisées dans la clause WHERE
?
Par exemple, dans la requête suivante :
SELECT `id`, @var := `id` * 2 FROM `user`
@var a été défini avec succès sur deux fois la valeur de `id`
Cependant, si j'essaie de filtrer l'ensemble de résultats pour inclure uniquement les résultats où @var est inférieur à 10 :
SELECT `id`, @var := `id` * 2 FROM `user` WHERE @var < 10
Ensuite, je n'ai obtenu aucun résultat.
Comment filtrer les résultats en fonction de la valeur de @var ?
Q : Les variables temporaires MySQL peuvent-elles être utilisées dans la clause WHERE ?
Oui. Les variables MySQL définies par l'utilisateur (telles que
@var
) peuvent être référencées dans la clause WHERE.Une variable définie par l'utilisateur est une référence à la valeur qui lui est actuellement attribuée lorsque l'expression est évaluée.
Dans une requête, les prédicats de la clause WHERE sont évalués avant les expressions de la liste SELECT.
C'est-à-dire que lors de l'accès à une ligne,
@var
sera évaluée comme une expression booléenne ; pour chaque ligne candidate, l'expression est évaluée et la ligne n'est renvoyée que si le résultat est VRAI.Si vous deviez fournir à cette variable une valeur numérique supérieure ou égale à 10, toutes les lignes seraient renvoyées avant d'exécuter l'instruction.
Q : Comment filtrer les résultats en fonction de la valeur de
@var
?Vous ne pouvez vraiment pas. (En fait, c'est ce que fait votre requête d'origine.)
Vous pouvez inclure des prédicats dans des expressions autres que
.@var
之外的其他表达式中包含谓词;这些表达式可以从分配给@var
; ces expressions peuvent être dérivées de la valeur attribuée àHAVING
子句来过滤返回的行。 (注意:HAVING
子句在结果集准备好之后进行计算;与WHERE
En option, vous pouvez renvoyer une expression dans la liste SELECT, puis utiliser une autre clause@var
以外的表达式应用谓词;他们实际上并没有对@var
Mais à proprement parler, ces méthodes appliquent toutes des prédicats à des expressions autres queVous devez attribuer un alias et le tester dans la clause
HAVING
:Notez que si vous utilisez simplement une formule pour filtrer, plutôt que de transmettre les résultats internes d'une ligne à la suivante, vous n'avez pas du tout besoin de cette variable. Vous pouvez écrire :