MySQL - Usando COUNT (*) na cláusula WHERE

157

Estou tentando realizar o seguinte no MySQL (consulte o pseudocódigo)

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

Existe uma maneira de fazer isso sem usar um (SELECT ...) na cláusula WHERE porque isso parece um desperdício de recursos.

shgnInc
fonte

Respostas:

264

tente isso;

select gid
from `gd`
group by gid 
having count(*) > 10
order by lastupdated desc
Ali Ersöz
fonte
37
+1 por ter Esta é sempre a cláusula que eles não se preocupam em ensinar adequadamente em cursos ou livros sql e saber sobre isso geralmente é o sinal de que o codificador progrediu além do nível de iniciante.
Cruachan
E se você estiver tentando usar o COUNT () como parte de uma expressão OR booleana? por exemploAND ((stock = 1 OR quantity > 0) OR (COUNT(v.id) > 0)
nnyby
Eu percebi isso .. você pode adicionar a cláusula HAVING assim:HAVING variations > 0 OR (stock = 1 OR quantity > 0)
nnyby
28

Não tenho certeza do que você está tentando fazer ... talvez algo como

SELECT gid, COUNT(*) AS num FROM gd GROUP BY gid HAVING num > 10 ORDER BY lastupdated DESC
Greg
fonte
1
MSSQL fornece erro de análise "nome de coluna inválido" para num. +1 de qualquer maneira para a sintaxe limpa (pode ser minha configuração ou ms ... ahh bem).
21417 Samis
Forneça um alias para todas as colunas na seleção.
precisa
17
SELECT COUNT(*)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC;

EDIT (se você quiser apenas os gids):

SELECT MIN(gid)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC
Winston Smith
fonte
Obrigado Joe, mas que retorna a COUNT () - Estou procurando devolver todos os gid's que possuem uma COUNT (*) mais de 10
1
Não há necessidade de Min () lá.
Ali Ersöz
14

experimentar

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

Apenas versão acadêmica sem cláusula:

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

Não pode haver funções agregadas (por exemplo, COUNT, MAX, etc.) na cláusula A WHERE. Portanto, usamos a cláusula HAVING. Portanto, toda a consulta seria semelhante a esta:

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

- procurando estações meteorológicas com registros perdidos a cada meia hora

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;

- variação de yapiskan com um onde .. em .. selecione

zzapper
fonte
1

Eu acho que você não pode adicionar count()com where. agora veja por que ....

wherenão é o mesmo que having, havingsignifica que você está trabalhando ou lidando com um grupo e com o mesmo trabalho, mas também com todo o grupo,

agora como contar está funcionando como um grupo inteiro

crie uma tabela e insira alguns IDs e use:

select count(*) from table_name

você encontrará os valores totais significa que está indicando algum grupo! assim whereque adicionado com count();

Tushar Pandey
fonte
1

COUNT (*) só pode ser usado com HAVING e deve ser usado após a instrução GROUP BY. Encontre o seguinte exemplo:

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
fonte