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.

Antworten:


264

Versuche dies;

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

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

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

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

14

Nur akademische Version ohne Klausel:

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

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;

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


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.