Comment puis-je compter les entrées MySQL avec un critère HAVING
-
04-10-2019 - |
Question
Vous pouvez habituellement juste faire
SELECT COUNT(field.id) FROM table WHERE field.id > 100
et COUNT (champ) retourne le nombre d'entrées que comporte le critère de field.id> 100
Mais si vous quoi compter les entrées spécifiées avec le critère HAVING tels que
SELECT COUNT(field.id), field.id * 10 AS foo FROM table HAVING foo > 100
le code ne fonctionnerait pas dans ce cas ....
Comment puis-je sur les entrées de comptage dont le critère sont spécifiées par la clause HAVING?
Merci à l'avance
La solution
Eh bien, fonctionne COUNT
AVANT HAVING
est appliqué à la jeu de résultats . Donc, si vous avez besoin de compter leur nombre -. Vous devez envelopper votre requête avec un autre
SELECT COUNT(*) FROM (
SELECT field.id * 10 AS foo FROM table HAVING foo > 100
)
Autres conseils
Je ne peux pas exécuter la requête soit en l'état - ils me donnent une erreur 1140 pour « en utilisant un agrégat sans clause GROUP BY » (IE: COUNT(field.id)
). Tout ne semble pas concerner l'ensemble du tout, juste la possibilité de référencer l'alias de colonne pour la comparaison ...
Le moyen le plus largement pris en charge est:
SELECT field.id * 10 AS foo
FROM table
WHERE field.id * 10 > 100
MySQL ne supporte référence à un alias de colonne dans la clause GROUP BY
ou HAVING
. Il ne nécessite pas l'utilisation des accents graves, mais je l'ai vu des cas qui ne travaillerait (mots non réservés) jusqu'à présent étaient les apostrophes inverses:
SELECT field.id * 10 AS foo
FROM table
HAVING `foo` > 100
Je ne recommande pas cette approche - il est pris en charge sur SQL Server, mais pas Oracle ...
La clause HAVING
est comme la clause de WHERE
, la différence est que les supports de clause de HAVING
les fonctions d'agrégation sans les avoir besoin d'être enveloppé dans une sous-requête.
AVERTISSEMENT - Je n'ai testé cela sur SQL Server
HAVING dans ce cas, n'effectuer des requêtes agrégées sur l'ensemble du jeu retourné. tout, vous ne pouvez pas exécuter d'abord
SELECT COUNT(field.id), field.id * 10 AS foo FROM table HAVING foo > 100
car field.id ne se trouve pas dans une clause qui définit un groupe ou une fonction d'agrégation; il ne fonctionne tout simplement pas compilé.
Cela dit, l'instruction SQL suivante -
SELECT COUNT(field.id) FROM table HAVING COUNT(field.id) > 100
retourne le nombre de lignes dans le tableau si le compte est supérieur à 100. Si ce n'est pas, vous obtiendrez aucun résultat.
Avez-vous un problème spécifique à l'esprit? Qu'est-ce que vous essayez de compter?