select wp_posts.* from wp_posts
where wp_posts.post_status='publish'and wp_posts.post_type='post'
group by wp_posts.post_author
having wp_posts.post_date = MAX(wp_posts.post_date) /* ONLY THE LAST POST FOR EACH AUTHOR */
order by wp_posts.post_date desc
EDYTUJ:
Po kilku komentarzach postanowiłem dodać kilka dodatkowych informacji.
Firma, w której pracuję, również korzysta z Postgresa, a zwłaszcza SQL Server. Te bazy danych nie pozwalają na takie zapytania. Więc wiem, że jest na to inny sposób (poniżej piszę rozwiązanie). Powinieneś także wiedzieć, co robisz, jeśli nie grupujesz według wszystkich kolumn traktowanych w projekcji lub nie używasz funkcji agregujących. W przeciwnym razie niech tak będzie!
Wybrałem rozwiązanie powyżej, bo to konkretne pytanie. Tomek chce uzyskać najnowszy post dla każdego autora w witrynie Wordpress. Moim zdaniem nie ma znaczenia, czy autor robi więcej niż jeden post na sekundę. Wordpress powinien nawet zabronić tego przez wykrywanie spamu-double-post. Wiem z własnego doświadczenia, że robienie tak brudnej grupy przez MySQL przynosi naprawdę znaczące korzyści. Ale jeśli wiesz, co robisz, możesz to zrobić! Mam takie brudne grupy w aplikacjach, za które odpowiadam zawodowo. Tutaj mam tabele z kilkoma milionami wierszy, które wymagają 5-15 sekund zamiast 100++ sekund.
Może być przydatny w przypadku niektórych zalet i wad:http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/debunking-group-by-myths.html
SELECT
wp_posts.*
FROM
wp_posts
JOIN
(
SELECT
g.post_author
MAX(g.post_date) AS post_date
FROM wp_posts as g
WHERE
g.post_status='publish'
AND g.post_type='post'
GROUP BY g.post_author
) as t
ON wp_posts.post_author = t.post_author AND wp_posts.post_date = t.post_date
ORDER BY wp_posts.post_date
Ale jeśli autor ma więcej niż jeden post na sekundę, otrzymasz więcej niż jeden wiersz, a nie jedyny ostatni .
Teraz możesz ponownie zakręcić kołem i uzyskać post z najwyższym Id
. Nawet tutaj nie ma przynajmniej gwarancji, że naprawdę dostaniesz ostatni.