Brug af en ORDER BY
i en underforespørgsel er ikke den bedste løsning på dette problem.
Den bedste løsning til at få max(post_date)
af forfatter er at bruge en underforespørgsel til at returnere den maksimale dato og derefter tilføje den til din tabel på både post_author
og maks. dato.
Løsningen bør være:
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
Hvis du har følgende eksempeldata:
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')
;
Underforespørgslen vil returnere maks. dato og forfatter til:
MaxPostDate | Author
2/1/2013 | Jim
Da du så slutter dig tilbage til bordet, vil du på begge værdier returnere alle oplysningerne om det pågældende indlæg.
Se SQL Fiddle with Demo .
For at udvide mine kommentarer om at bruge en underforespørgsel til at returnere disse data nøjagtigt.
MySQL tvinger dig ikke til at GROUP BY
hver kolonne, du inkluderer i SELECT
liste. Som et resultat, hvis du kun GROUP BY
én kolonne, men returnerer 10 kolonner i alt, er der ingen garanti for, at de andre kolonneværdier, der tilhører post_author
der returneres. Hvis kolonnen ikke er i en GROUP BY
MySQL vælger hvilken værdi der skal returneres.
Brug af underforespørgslen med aggregatfunktionen garanterer, at den korrekte forfatter og indlæg returneres hver gang.
Som en sidebemærkning, mens MySQL giver dig mulighed for at bruge en ORDER BY
i en underforespørgsel og giver dig mulighed for at anvende en GROUP BY
til ikke hver kolonne i SELECT
liste denne adfærd er ikke tilladt i andre databaser inklusive SQL Server.