Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL ordenar por antes de agrupar por


Usando um ORDER BY em uma subconsulta não é a melhor solução para este problema.

A melhor solução para obter o max(post_date) por autor é usar uma subconsulta para retornar a data máxima e depois juntá-la à sua tabela no post_author e a data máxima.

A solução deve 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

Se você tiver os seguintes dados de exemplo:
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')
;

A subconsulta retornará a data máxima e o autor de:
MaxPostDate | Author
2/1/2013    | Jim

Então, já que você está juntando isso de volta à tabela, em ambos os valores, você retornará os detalhes completos dessa postagem.

Consulte SQL Fiddle with Demo .

Para expandir meus comentários sobre o uso de uma subconsulta para retornar esses dados com precisão.

O MySQL não força você a GROUP BY cada coluna que você inclui no SELECT Lista. Como resultado, se você apenas GROUP BY uma coluna, mas retornam 10 colunas no total, não há garantia de que os outros valores de coluna que pertencem ao post_author que é devolvido. Se a coluna não estiver em um GROUP BY O MySQL escolhe qual valor deve ser retornado.

Usar a subconsulta com a função agregada garantirá que o autor e a postagem corretos sejam retornados sempre.

Como uma nota lateral, enquanto o MySQL permite que você use um ORDER BY em uma subconsulta e permite que você aplique um GROUP BY para nem todas as colunas no SELECT list esse comportamento não é permitido em outros bancos de dados, incluindo SQL Server.