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
.Даже здесь, по крайней мере, не гарантируется, что вы действительно получите последний.