MySQL - Utilisation de COUNT (*) dans la clause WHERE

157

J'essaye d'accomplir ce qui suit dans MySQL (voir le pseudocode)

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

Existe-t-il un moyen de le faire sans utiliser un (SELECT ...) dans la clause WHERE, car cela semblerait être un gaspillage de ressources.

shgnInc
la source

Réponses:

265

essaye ça;

select gid
from `gd`
group by gid 
having count(*) > 10
order by lastupdated desc
Ali Ersöz
la source
37
+1 pour avoir C'est toujours la clause qu'ils ne prennent pas la peine d'enseigner correctement sur des cours SQL ou des livres et en sachant généralement le signe que le codeur a progressé au-delà du niveau novice.
Cruachan
Que faire si vous essayez d'utiliser COUNT () dans le cadre d'une expression booléenne OR? egAND ((stock = 1 OR quantity > 0) OR (COUNT(v.id) > 0)
nnyby
Je l'ai compris .. vous pouvez ajouter à la clause HAVING comme ceci:HAVING variations > 0 OR (stock = 1 OR quantity > 0)
nnyby
28

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
Greg
la source
1
MSSQL donne une erreur d'analyse "nom de colonne non valide" pour num. +1 de toute façon pour la syntaxe propre (pourrait être ma configuration, ou ms ... ahh bien).
samis
Fournissez un alias pour toutes les colonnes de la sélection.
Adil Khalil
18
SELECT COUNT(*)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC;

EDIT (si vous voulez juste les gids):

SELECT MIN(gid)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC
Winston Smith
la source
Merci Joe mais cela renvoie le COUNT () - Je cherche à retourner tous les gid qui ont un COUNT (*) plus de 10
1
Il n'y a pas besoin de Min () là-dedans.
Ali Ersöz
14

essayer

SELECT DISTINCT gid
FROM `gd`
group by gid
having count(*) > 10
ORDER BY max(lastupdated) DESC
pme
la source
14

Juste une version académique sans clause:

select *
from (
   select gid, count(*) as tmpcount from gd group by gid
) as tmp
where tmpcount > 10;
Máťa - Stitod.cz
la source
13

Il ne peut pas y avoir de fonctions d'agrégation (par exemple, COUNT, MAX, etc.) dans la clause A WHERE. Par conséquent, nous utilisons la clause HAVING à la place. Par conséquent, toute la requête serait similaire à 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;
pushkarr
la source
6

- recherche de stations météorologiques avec des enregistrements demi-horaires manquants

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 de yapiskan avec un where .. in .. select

zzapper
la source
1

je pense que vous ne pouvez pas ajouter count()avec where. maintenant, voyez pourquoi ...

wheren'est pas la même chose que having, havingsignifie que vous travaillez ou traitez avec un groupe et le même travail de comptage, cela concerne également l'ensemble du groupe,

maintenant comment compter ça fonctionne comme un groupe entier

créez une table et entrez des identifiants, puis utilisez:

select count(*) from table_name

vous trouverez le total des valeurs signifie qu'il indique un groupe! ainsi wherefait ajouté avec count();

Tushar Pandey
la source
1

COUNT (*) ne peut être utilisé qu'avec HAVING et doit être utilisé après l'instruction GROUP BY Veuillez trouver l'exemple suivant:

SELECT COUNT(*), M_Director.PID FROM Movie
INNER JOIN M_Director ON Movie.MID = M_Director.MID 
GROUP BY M_Director.PID
HAVING COUNT(*) > 10
ORDER BY COUNT(*) ASC
Mridul Pandey
la source