2008-11-19 13 views
118

estoy tratando de lograr lo siguiente en MySQL (ver pseudo código)MySQL - El uso de COUNT (*) en la cláusula WHERE

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

¿Hay una manera de hacer esto sin necesidad de utilizar un (SELECT ...) en la cláusula WHERE porque eso parecería un desperdicio de recursos.

Toda ayuda es apreciada.

¡Gracias!

Respuesta

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

EDITAR (si lo que desea el GID):

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

Gracias Joe, pero que devuelve el número() - Busco para devolver todos los años gid que tienen un COUNT (*) más de 10 –

+1

No hay necesidad de Min() allí. –

206

probar este;

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

+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, por lo general, saber que es el signo de que el codificador ha progresado más allá del nivel de principiante. – Cruachan

+0

¡Gracias! Funciona –

+0

Resolvió mi problema también, muchas gracias. –

21

No estoy seguro de lo que estamos tratando de hacer ... tal vez algo como

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

MSSQL da *" nombre de columna no válido "* error de análisis para' num'. +1 de todos modos para la sintaxis limpia (podría ser mi configuración, o ms ... ahh bien). – samosaris

+0

Proporcione un alias para todas las columnas en la selección. –

12

tratar

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

¡Gracias! Funciona –

4

- la búsqueda de estaciones meteorológicas con la mitad que falta -hourly records

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; 

- variation o f yapiskan con un donde ... en .. seleccione

1

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

where no es igual que having, having significa que está trabajando o hacer frente a grupo y la misma obra de recuento, sino que también se ocupa de todo el grupo,

ahora cómo lo cuenta está trabajando como todo el grupo

crear una tabla y escriba algunas de id y luego usar:

select count(*) from table_name 

encontrará los valores totales significa que está indicando algún grupo! por lo que where se agrega con count();

9

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

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

No puede haber funciones de agregado (Ex. COUNT, MAX, etc.) en una cláusula 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; 
Cuestiones relacionadas