sql >> Base de Datos >  >> RDS >> Mysql

MySQL ordenar por antes de agrupar por

Usando un ORDER BY en una subconsulta no es la mejor solución a este problema.

La mejor solución para obtener el max(post_date) by author es usar una subconsulta para devolver la fecha máxima y luego unirla a su tabla tanto en post_author y la fecha máxima.

La solución debería ser:

SELECT p1.* 
FROM wp_posts p1
INNER JOIN
(
    SELECT max(post_date) MaxPostDate, post_author
    FROM wp_posts
    WHERE post_status='publish'
       AND post_type='post'
    GROUP BY post_author
) p2
  ON p1.post_author = p2.post_author
  AND p1.post_date = p2.MaxPostDate
WHERE p1.post_status='publish'
  AND p1.post_type='post'
order by p1.post_date desc

Si tiene los siguientes datos de muestra:

CREATE TABLE wp_posts
    (`id` int, `title` varchar(6), `post_date` datetime, `post_author` varchar(3))
;

INSERT INTO wp_posts
    (`id`, `title`, `post_date`, `post_author`)
VALUES
    (1, 'Title1', '2013-01-01 00:00:00', 'Jim'),
    (2, 'Title2', '2013-02-01 00:00:00', 'Jim')
;

La subconsulta devolverá la fecha máxima y el autor de:

MaxPostDate | Author
2/1/2013    | Jim

Luego, dado que está uniendo eso a la tabla, en ambos valores devolverá los detalles completos de esa publicación.

Consulte SQL Fiddle con demostración .

Para ampliar mis comentarios sobre el uso de una subconsulta para devolver estos datos con precisión.

MySQL no te obliga a GROUP BY cada columna que incluyas en el SELECT lista. Como resultado, si solo GROUP BY una columna pero devuelve 10 columnas en total, no hay garantía de que los otros valores de columna que pertenecen al post_author que se devuelve. Si la columna no está en un GROUP BY MySQL elige qué valor debe devolverse.

El uso de la subconsulta con la función agregada garantizará que siempre se devuelva el autor y la publicación correctos.

Como nota al margen, mientras que MySQL le permite usar un ORDER BY en una subconsulta y le permite aplicar un GROUP BY a no todas las columnas en el SELECT Liste este comportamiento no está permitido en otras bases de datos, incluido SQL Server.