MySQL: uso de COUNT (*) en la cláusula WHERE

157

Estoy tratando de lograr lo siguiente en MySQL (ver pseudocódigo)

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

¿Hay alguna manera de hacer esto sin usar un (SELECCIONAR ...) en la cláusula WHERE porque eso parecería un desperdicio de recursos?

shgnInc
fuente

Respuestas:

265

prueba esto;

select gid
from `gd`
group by gid 
having count(*) > 10
order by lastupdated desc
Ali Ersöz
fuente
37
+1 por tener Esta es siempre la cláusula de que no se molestan en enseñar correctamente en cursos o libros de sql y saberlo generalmente es la señal de que el codificador ha progresado más allá del nivel de principiante.
Cruachan
¿Qué sucede si está intentando utilizar COUNT () como parte de una expresión OR booleana? por ejemploAND ((stock = 1 OR quantity > 0) OR (COUNT(v.id) > 0)
nnyby
Lo descubrí ... puedes agregar a la cláusula HAVING de esta manera:HAVING variations > 0 OR (stock = 1 OR quantity > 0)
nnyby
28

No estoy seguro de lo que estás tratando de hacer ... tal vez algo como

SELECT gid, COUNT(*) AS num FROM gd GROUP BY gid HAVING num > 10 ORDER BY lastupdated DESC
Greg
fuente
1
MSSQL da un error de análisis de "nombre de columna no válido" para num. +1 de todos modos para la sintaxis limpia (podría ser mi configuración, o ms ... ahh bien).
samis
Proporcione un alias para todas las columnas en la selección.
Adil Khalil
18
SELECT COUNT(*)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC;

EDITAR (si solo quieres los gids):

SELECT MIN(gid)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC
Winston Smith
fuente
Gracias Joe, pero eso devuelve el COUNT () - Estoy buscando devolver todos los gid que tienen un COUNT (*) más de 10
1
No hay necesidad de Min () allí.
Ali Ersöz
14

tratar

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

Solo versión académica sin tener cláusula:

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

No puede haber funciones agregadas (Ej. COUNT, MAX, etc.) en la cláusula A WHERE. Por lo tanto, usamos la cláusula HAVING en su lugar. Por lo tanto, toda la consulta sería similar a esto:

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

- buscando estaciones meteorológicas con registros faltantes cada media 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;

- variación de yapiskan con un donde .. en .. seleccione

zzapper
fuente
1

Creo que no se puede agregar count()con where. ahora ve por qué ...

whereno es igual que having,having significa que está trabajando o tratando con el grupo y el mismo trabajo de conteo, también está tratando con todo el grupo,

ahora cómo cuenta está funcionando como grupo completo

crea una tabla e ingresa algunas identificaciones y luego usa:

select count(*) from table_name

¡encontrará los valores totales significa que está indicando algún grupo! también wherelo agrega con count();

Tushar Pandey
fuente
1

COUNT (*) solo se puede usar con HAVING y se debe usar después de la instrucción GROUP BY. Busque el siguiente ejemplo:

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
fuente