Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utiliser `rand()` avec `avoir`

Je pense que le problème est que HAVING est appliqué après GROUP BY, mais toujours avant la phase SELECT. Je me rends compte que c'est déroutant parce que la clause HAVING fait référence à une colonne de l'instruction SELECT, mais je pense qu'en gros, elle exécute simplement ce qui se trouve dans l'instruction SELECT deux fois - une fois pour l'avoir, puis à nouveau pour le SELECT.

Par exemple, voir cette réponse .

Notez que c'est particulièrement déroutant car si vous faites référence à un nom de colonne qui n'apparaît pas dans l'instruction SELECT d'une clause HAVING, une erreur sera générée.

Par exemple, ce violon

Mais selon ce violon ci-dessus, cela vous permettra toujours de filtrer en fonction du résultat d'une fonction qui n'apparaît pas dans la sortie. Pour faire court, la clause HAVING fait toujours ce que vous voulez, mais vous ne pouvez pas à la fois filtrer sur une valeur aléatoire et l'afficher en même temps en utilisant cette approche. Si vous avez besoin de le faire, vous devez d'abord utiliser une sous-requête pour fixer la valeur, puis la requête externe peut filtrer et afficher dessus.

De plus, pour être clair, il vaut probablement la peine d'utiliser simplement RAND() dans la clause having, pas la partie SQL. Bien que je comprenne que cette question demande pourquoi il fait cela plutôt que d'essayer de résoudre le problème spécifiquement.