2010-01-22 14 views
6

Aquí es una versión simplificada de mi mesaCómo realizar un pedido, grupo, ordenar con MySQL

tbl_records 
-title 
-created 
-views 

Me pregunto cómo puedo hacer una consulta en la que se agrupan por el título, pero el registro que se devuelve para cada grupo es el creado más recientemente. Entonces lo ordenaré por puntos de vista.

Una forma, supongo, es hacer una sub consulta y ordenarla por crearla y luego agruparla por título y luego, a partir de esos resultados, ordenarla por vistas. Aunque creo que hay una mejor manera.

Gracias

EDIT:

DATOS DE MUESTRA:

-title: Gnu Design 
-created: 2009-11-11 14:47:18 
-views: 104 

-title: Gnu Design 
-created:2010-01-01 21:37:09 
-views:9 

-title: French Connection 
-created:2010-05-01 09:27:19 
-views:20 

me gustaría que los resultados sean:

-title: French Connection 
-created:2010-05-01 09:27:19 
-views:20 

-title: Gnu Design 
-created:2010-01-01 21:37:09 
-views:9 

Sólo los más recen t Se muestra Gnu Design y luego los resultados se ordenan por vistas.

+1

Si tiene datos de muestra, sería mucho más claro. – Yada

+0

Sí, aclare la pregunta. –

Respuesta

3

Este es un ejemplo del problema greatest-n-per-group que aparece con frecuencia en StackOverflow.

aquí está mi solución habitual:

SELECT t1.* 
FROM tbl_records t1 
LEFT OUTER JOIN tbl_records t2 ON (t1.title = t2.title AND 
    (t1.created < t2.created OR t1.created = t2.created AND t1.primarykey < t2.primarykey)) 
WHERE t2.title IS NULL; 

Explicación: buscar la fila t1 para los que no existe otra fila t2 con el mismo title y una mayor created fecha. En caso de empates, use alguna clave única para resolver el empate, a menos que esté bien obtener múltiples filas por title.

1
select i.*, o.views from 
    (
     select 
     title 
     , max(created) as last_created 
     from tbl_records 
     group by title 
    ) i inner join tbl_records o 
    on i.title = o.title and i.last_created = o.created 
    order by o.views desc 

Estoy asumiendo que la agregación aplicables a views es count(), pero podría estar equivocado (que tendrá que tener alguna manera de definir qué medida de puntos de vista que desea tener para el lastest creado título). Espero que ayude.

EDIT: he visto los datos de muestra y los edité en consecuencia.

0
SELECT title, 
     MAX(created), 
     views 
FROM table 
GROUP BY title 
ORDER BY views DESC