MySQL - użycie COUNT (*) w klauzuli WHERE


157

Próbuję wykonać następujące czynności w MySQL (patrz pseudokod)

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

Czy istnieje sposób na zrobienie tego bez użycia (SELECT ...) w klauzuli WHERE, ponieważ wydawałoby się to marnotrawstwem zasobów.

Odpowiedzi:


264

Spróbuj tego;

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

37
+1 za posiadanie To jest zawsze klauzula, której nie zawracają sobie głowy prawidłowym nauczaniem na kursach sql lub książkach, a wiedza o tym jest ogólnie oznaką, że programista wyszedł poza poziom nowicjusza.
Cruachan

Co jeśli próbujesz użyć COUNT () jako części logicznego wyrażenia OR? np.AND ((stock = 1 OR quantity > 0) OR (COUNT(v.id) > 0)
nnyby

Rozgryzłem to ... możesz dodać do klauzuli HAVING w ten sposób:HAVING variations > 0 OR (stock = 1 OR quantity > 0)
nnyby

28

Nie jestem pewien, co próbujesz zrobić ... może coś takiego

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

1
MSSQL podaje błąd analizy „nieprawidłowa nazwa kolumny”num . W każdym razie +1 dla czystej składni (może to być moja konfiguracja lub ms ... ahh cóż).
samis

Podaj alias dla wszystkich kolumn w polu wyboru.
Adil Khalil

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

EDYTUJ (jeśli chcesz tylko gidy):

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

Dzięki Joe, ale to zwraca COUNT () - chcę zwrócić wszystkie gid, które mają COUNT (*) więcej niż 10

1
Nie ma tam potrzeby Min ().
Ali Ersöz,

14

próbować

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

14

Tylko wersja akademicka bez klauzuli:

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

13

W klauzuli A WHERE nie może być funkcji agregujących (np. COUNT, MAX itp.). Dlatego zamiast tego używamy klauzuli HAVING. Dlatego całe zapytanie byłoby podobne do tego:

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

- wyszukiwanie stacji meteorologicznych z brakującymi zapisami półgodzinnymi

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;

- odmiana yapiskan z gdzie… w… wybierz


1

myślę, że nie możesz dodać za count()pomocą where. teraz zobacz, dlaczego ....

whereto nie to samo co having, havingoznacza, że ​​pracujesz lub masz do czynienia z grupą i taką samą pracą liczenia, to także dotyczy całej grupy,

teraz jak liczyć to działa jako cała grupa

utwórz tabelę i wprowadź jakieś identyfikatory, a następnie użyj:

select count(*) from table_name

znajdziesz wartości całkowite, które oznaczają jakąś grupę! tak też wherejest dodane z count();


1

LICZBA (*) może być używane tylko z HAVING i musi być używane po wyrażeniu GROUP BY Poniżej znajduje się następujący przykład:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.