2010-09-20 22 views
0

Ainsi, vous pouvez simplement faire habituellementComment puis-je compter les entrées MySQL avec un critère HAVING

SELECT COUNT(field.id) FROM table WHERE field.id > 100 

et COUNT (champ) renvoie le nombre d'entrées qui a le critère de field.id> 100

Mais si vous quoi compter les entrées spécifiées avec le critère AYANT 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 faire pour compter les entrées dont les critères sont spécifiés via la clause HAVING?

Merci à l'avance

+0

Dans votre échantillon ** HAVING ** est surutilisé. Utilisez ** WHERE ** ou imaginez un autre exemple. – zerkms

+1

Je ne peux pas exécuter une requête telle quelle - elle me donne une erreur 1140 pour l'utilisation d'un agrégat sans clause GROUP BY (IE: 'COUNT (field.id)'). Tout semble ne pas se rapporter à l'agrégat du tout, juste la capacité de référencer l'alias de la colonne pour la comparaison ... –

Répondre

5

Eh bien, COUNT fonctionne AVANTHAVING est appliqué au 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 
) 
+0

c'est génial, bien que je devais ajouter tourner la requête à SELECT COUNT (*) DE ( SELECT field.id * 10 AS foo FROM table ayant foo> 100 ) AS dérivé –

+0

@kamikaze_pilot: yup, j'ai oublié que dans Dans ce cas, nous devrions donner un alias pour les requêtes imbriquées. – zerkms

1

disclaimer - Je n'ai testé cela sur SQL Server

AYANT dans ce cas ne fera effectuer des requêtes agrégées sur l'ensemble de retour ensemble. Tout d'abord, vous ne pouvez pas exécuter

SELECT COUNT(field.id), field.id * 10 AS foo FROM table HAVING foo > 100 

parce field.id ne figure pas dans une clause qui définit un groupe ou d'une fonction d'agrégation; ça ne compile pas.

Cela dit, l'instruction SQL suivante -

SELECT COUNT(field.id) FROM table HAVING COUNT(field.id) > 100 

renverra le nombre de lignes dans le tableau si le nombre est supérieur à 100. Si ce n'est pas, vous obtiendrez aucun résultat.

Avez-vous un problème spécifique en tête? Qu'essayez-vous de compter?

2

Je ne peux pas exécuter la requête telle quelle - ils me donnent une erreur 1140 pour "utiliser un agrégat sans une 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 prend en charge le référencement d'un alias de colonne 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 fonctionnerait pas (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 WHERE, la différence est que la clause HAVING prend en charge les fonctions globales sans les avoir besoin d'être enveloppé dans une sous-requête.

+1

@Martin Smith: Pourrait être, mais il y avait une question récemment qui ne fonctionnerait pas, sauf si l'alias était en backticks donc Je vais errer du côté de la prudence. –

+0

btw, votre deuxième requête retournera toujours l'ensemble vide, à cause de 'HAVING' – zerkms

+0

@zerkms: Les deux sont équivalents –