2008-11-19 7 views
118

Je tente d'accomplir ce qui suit dans MySQL (voir code pseudo)MySQL - Utilisation de COUNT (*) dans la clause WHERE

SELECT DISTINCT gid 
FROM `gd` 
WHERE COUNT(*) > 10 
ORDER BY lastupdated DESC 

Est-il possible de le faire sans l'aide d'un (SELECT ...) dans la clause WHERE parce que cela semblerait être un gaspillage de ressources.

Toute aide est appréciée.

Merci!

Répondre

11
SELECT COUNT(*) 
FROM `gd` 
GROUP BY gid 
HAVING COUNT(gid) > 10 
ORDER BY lastupdated DESC; 

EDIT (si vous voulez juste les IUED):

SELECT MIN(gid) 
FROM `gd` 
GROUP BY gid 
HAVING COUNT(gid) > 10 
ORDER BY lastupdated DESC 
+0

Merci Joe, mais qui retourne le COUNT() - Je suis à la recherche de retourner toutes les années GID qui ont un COUNT (*) plus de 10 –

+1

Il n'y a pas besoin de Min() là-bas. –

206

essayer cette;

select gid 
from `gd` 
group by gid 
having count(*) > 10 
order by lastupdated desc 
+25

+1 pour avoir Ceci est * toujours * la clause qu'ils ne prennent pas la peine d'enseigner correctement sur les cours sql ou les livres et en sachant généralement que le codeur a progressé au-delà du niveau novice. – Cruachan

+0

Merci! Cela fonctionne –

+0

J'ai aussi résolu mon problème, merci beaucoup. –

21

Je ne suis pas sûr de ce que vous essayez de faire ... peut-être quelque chose comme

SELECT gid, COUNT(*) AS num FROM gd GROUP BY gid HAVING num > 10 ORDER BY lastupdated DESC 
+0

MSSQL donne *" nom de colonne invalide "* erreur d'analyse pour' num'. +1 de toute façon pour la syntaxe propre (pourrait être ma configuration, ou ms ... ahh bien). – samosaris

+0

Indiquez un alias pour toutes les colonnes de la sélection. –

12

essayer

SELECT DISTINCT gid 
FROM `gd` 
group by gid 
having count(*) > 10 
ORDER BY max(lastupdated) DESC 
+0

Merci! Ça marche –

4

- la recherche de stations météorologiques avec la moitié manquante -heure enregistrements

SELECT stationid 
FROM weather_data 
WHERE `Timestamp` LIKE '2011-11-15 %' AND 
stationid IN (SELECT `ID` FROM `weather_stations`) 
GROUP BY stationid 
HAVING COUNT(*) != 48; 

- variation o f yapiskan avec un où .. dans .. sélectionnez

1

Je pense que vous ne pouvez pas ajouter count() avec where. maintenant voir pourquoi ....

where n'est pas identique à having, having signifie que vous travaillez ou traiter avec le groupe et même travail de comptage, il traite aussi avec tout le groupe,

maintenant comment il compte travaille en tant que groupe entier

créer une table et entrez quelques ids puis utilisez:

select count(*) from table_name 

vous trouverez les valeurs totales signifie qu'il est indique un certain groupe! donc where a été ajouté avec count();

9

Juste version académique sans clause:

select * 
from (
    select gid, count(*) as tmpcount from gd group by gid 
) as tmp 
where tmpcount > 10; 
3

Il ne peut y avoir des fonctions d'agrégation (Ex. COUNT, MAX, etc.) dans une clause WHERE. Par conséquent, nous utilisons la clause HAVING à la place. Par conséquent, toute requête serait semblable à ceci:

SELECT column_name, aggregate_function(column_name) 
FROM table_name 
WHERE column_name operator value 
GROUP BY column_name 
HAVING aggregate_function(column_name) operator value; 
Questions connexes