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.