MySQL - Verwenden von COUNT (*) in der WHERE-Klausel

157

Ich versuche Folgendes in MySQL zu erreichen (siehe pseudoCode)

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

Gibt es eine Möglichkeit, dies zu tun, ohne ein (SELECT ...) in der WHERE-Klausel zu verwenden, da dies wie eine Verschwendung von Ressourcen erscheint.

shgnInc
quelle

Antworten:

264

Versuche dies;

select gid
from `gd`
group by gid 
having count(*) > 10
order by lastupdated desc
Ali Ersöz
quelle
37
+1 für haben Dies ist immer die Klausel, dass sie sich nicht die Mühe machen, in SQL-Kursen oder Büchern richtig zu unterrichten, und dass dies im Allgemeinen das Zeichen dafür ist, dass der Programmierer über das Anfängerniveau hinaus fortgeschritten ist.
Cruachan
Was ist, wenn Sie versuchen, COUNT () als Teil eines booleschen ODER-Ausdrucks zu verwenden? zBAND ((stock = 1 OR quantity > 0) OR (COUNT(v.id) > 0)
nnyby
Ich habe es herausgefunden. Sie können die HAVING-Klausel wie folgt hinzufügen:HAVING variations > 0 OR (stock = 1 OR quantity > 0)
nnyby
28

Ich bin mir nicht sicher, was du versuchst ... vielleicht so etwas

SELECT gid, COUNT(*) AS num FROM gd GROUP BY gid HAVING num > 10 ORDER BY lastupdated DESC
Greg
quelle
1
MSSQL gibt den Analysefehler "ungültiger Spaltenname" für aus num. +1 sowieso für die saubere Syntax (könnte mein Setup sein, oder ms ... ahh gut).
Samis
Geben Sie einen Alias ​​für alle Spalten in der Auswahl an.
Adil Khalil
17
SELECT COUNT(*)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC;

BEARBEITEN (wenn Sie nur die Gids wollen):

SELECT MIN(gid)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC
Winston Smith
quelle
Danke Joe, aber das gibt den COUNT () zurück - Ich möchte alle Gids zurückgeben, die einen COUNT (*) von mehr als 10 haben
1
Es ist nicht nötig, Min () zu verwenden.
Ali Ersöz
14

Versuchen

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

Nur akademische Version ohne Klausel:

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

Die A WHERE-Klausel darf keine Aggregatfunktionen (z. B. COUNT, MAX usw.) enthalten. Daher verwenden wir stattdessen die HAVING-Klausel. Daher wäre die gesamte Abfrage ähnlich:

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
quelle
6

- Suche nach Wetterstationen mit fehlenden halbstündlichen Aufzeichnungen

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 von Yapiskan mit einem wo .. in .. auswählen

zzapper
quelle
1

Ich glaube , Sie können nicht hinzufügen count()mit where. Jetzt sehen Sie warum ...

whereist nicht dasselbe wie having, havingbedeutet , dass Sie arbeiten oder mit einer Gruppe und derselben Zählarbeit arbeiten, es befasst sich auch mit der gesamten Gruppe,

Nun, wie zählt es, als ganze Gruppe zu arbeiten

Erstellen Sie eine Tabelle, geben Sie einige IDs ein und verwenden Sie dann:

select count(*) from table_name

Sie werden feststellen, dass die Gesamtwerte bedeuten, dass eine Gruppe angezeigt wird! so wherefügt hinzu mit count();

Tushar Pandey
quelle
1

COUNT (*) kann nur mit HAVING verwendet werden und muss nach der Anweisung GROUP BY verwendet werden. Das folgende Beispiel finden Sie hier:

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
quelle