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?

Respuestas:


265

prueba esto;

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

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

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

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

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;

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;

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


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.