Een ORDER BY
gebruiken in een subquery is niet de beste oplossing voor dit probleem.
De beste oplossing om de max(post_date)
. te krijgen door auteur is om een subquery te gebruiken om de maximale datum terug te geven en die vervolgens toe te voegen aan uw tabel op zowel de post_author
en de maximale datum.
De oplossing zou moeten zijn:
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
Als u over de volgende voorbeeldgegevens beschikt:
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')
;
De subquery retourneert de maximale datum en auteur van:
MaxPostDate | Author
2/1/2013 | Jim
Aangezien je dat weer terugbrengt naar de tabel, geef je op beide waarden de volledige details van dat bericht terug.
Zie SQL Fiddle met demo .
Om uit te breiden op mijn opmerkingen over het gebruik van een subquery om deze gegevens nauwkeurig te retourneren.
MySQL dwingt je niet om GROUP BY
elke kolom die u opneemt in de SELECT
lijst. Als gevolg hiervan, als u alleen GROUP BY
één kolom maar retourneert in totaal 10 kolommen, er is geen garantie dat de andere kolomwaarden die behoren tot de post_author
dat wordt teruggegeven. Als de kolom niet in een GROUP BY
staat MySQL kiest welke waarde moet worden geretourneerd.
Het gebruik van de subquery met de aggregatiefunctie garandeert dat de juiste auteur en het juiste bericht elke keer wordt geretourneerd.
Even terzijde, terwijl u met MySQL een ORDER BY
. kunt gebruiken in een subquery en stelt u in staat om een GROUP BY
. toe te passen naar niet elke kolom in de SELECT
lijst dit gedrag is niet toegestaan in andere databases, inclusief SQL Server.