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.