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.

Réponses:


265

essaye ça;

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

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

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

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

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;

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;

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


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();


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.