Använder en ORDER BY
i en underfråga är inte den bästa lösningen på detta problem.
Den bästa lösningen för att få max(post_date)
av författaren är att använda en underfråga för att returnera maxdatumet och sedan lägga till det i din tabell på både post_author
och maxdatum.
Lösningen bör vara:
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
Om du har följande exempeldata:
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')
;
Underfrågan kommer att returnera maxdatum och författare till:
MaxPostDate | Author
2/1/2013 | Jim
Sedan, eftersom du förenar det tillbaka till tabellen, kommer du att returnera alla detaljer för det inlägget för båda värdena.
Se SQL-fiol med demo .
För att utöka mina kommentarer om att använda en underfråga för att korrekt returnera denna data.
MySQL tvingar dig inte att GROUP BY
varje kolumn som du inkluderar i SELECT
lista. Som ett resultat, om du bara GROUP BY
en kolumn men returnerar 10 kolumner totalt, det finns ingen garanti för att de andra kolumnvärdena som tillhör post_author
som returneras. Om kolumnen inte är i en GROUP BY
MySQL väljer vilket värde som ska returneras.
Att använda underfrågan med aggregatfunktionen garanterar att rätt författare och inlägg returneras varje gång.
Som en sidoanteckning, medan MySQL låter dig använda en ORDER BY
i en underfråga och låter dig tillämpa en GROUP BY
till inte varje kolumn i SELECT
lista detta beteende är inte tillåtet i andra databaser inklusive SQL Server.