2011-07-18 51 views
18

¿Cómo combino correctamente esta declaración?Cómo combinar GROUP BY, ORDER BY y HABER

SELECT *, COUNT(*) 
FROM user_log 
GROUP BY Email 
ORDER BY UpdateDate DESC 
HAVING COUNT(*) > 1 

Avísame

+0

general GROUP BY consejo: "Si se especifica una cláusula GROUP BY, cada referencia de columna en la lista SELECT debe identificar una columna de agrupación o ser el argumento de un establecer la función ". – jarlh

Respuesta

42

ORDER BY siempre es la última ...

Sin embargo, usted necesita escoger los campos que QUIERE REALMENTE a continuación, seleccione sólo aquellos y el grupo por ellos. SELECT * y GROUP BY Email le dará VALORES ALEATORIOS para todos los campos excepto Email. La mayoría de RDBMS ni siquiera le permitirá hacer esto debido a los problemas que crea, pero MySQL es la excepción.

SELECT Email, COUNT(*) 
FROM user_log 
GROUP BY Email 
HAVING COUNT(*) > 1 
ORDER BY UpdateDate DESC 
+2

+1 punto agradable sobre MySQL y GROUP BY –

+0

(Cuando tienes un 'GROUP BY'), la misma lógica aplica para todos los campos que pones en la lista' SELECT', la cláusula 'HAVING' y la cláusula' ORDER BY' . Por lo tanto, también se aplica para 'ORDER BY UpdateDate'. A menos que 'UpdateDate' dependa de' Email', obtendrás un orden bastante aleatorio. –

-2

pasos para usar Grupo por, Tener y por Ordenar por ...

Select Attitude ,count(*) from Person 
group by person 
HAving PersonAttitude='cool and friendly' 
Order by PersonName. 
+0

La regla general GROUP BY es: "Si se especifica una cláusula GROUP BY, cada referencia de columna en la lista SELECT debe identificar una columna de agrupación o ser el argumento de una función establecida," – jarlh

-1

El código debería ser contiene WHILE antes group by y having:

SELECT Email, COUNT(*) 

FROM user_log 

WHILE Email IS NOT NULL 

GROUP BY Email 

HAVING COUNT(*) > 1 

ORDER BY UpdateDate DESC 
+1

Copiar bien pegar: P –