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
РЕДАКТИРАНЕ:
След някои коментари реших да добавя допълнителна информация.
Компанията, в която работя, също използва Postgres и особено SQL Server. Тези бази данни не позволяват такива заявки. Така че знам, че има друг начин да направя това (пиша решение по-долу). Вие също трябва да знаете какво правите, ако не групирате по всички колони, третирани в проекцията, или не използвате агрегатни функции. Иначе нека бъде!
Избрах решението по-горе, защото това е конкретен въпрос. Том иска да получи скорошната публикация за всеки автор в wordpress сайт. Според мен е пренебрежимо малко за анализа, ако авторът прави повече от една публикация в секунда. Wordpress дори трябва да го забрани чрез откриването на двоен спам. От личен опит знам, че има наистина значителна полза в производителността, когато се прави такава мръсна група с MySQL. Но ако знаете какво правите, тогава можете да го направите! Имам такива мръсни групи в приложения, за които отговарям професионално. Тук имам таблици с няколко mio реда, които се нуждаят от 5-15 секунди вместо 100++ секунди.
Може да е полезно за някои плюсове и минуси: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
Но ако тук има повече от една публикация в секунда за автор, ще получите повече от един ред, а не единственият последен .
Сега можете отново да завъртите колелото и да получите публикацията с най-висок Id
. Дори тук поне не е гарантирано, че наистина ще получите последния.