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
MODIFICA:
Dopo alcuni commenti ho deciso di aggiungere alcune informazioni aggiuntive.
L'azienda in cui lavoro utilizza anche Postgres e in particolare SQL Server. Questi database non consentono tali query. Quindi so che esiste un altro modo per farlo (scrivo una soluzione di seguito). Dovresti anche sapere cosa fare se non raggruppi per tutte le colonne trattate nella proiezione o non usi funzioni di aggregazione. Altrimenti lascia che sia!
Ho scelto la soluzione sopra, perché è una domanda specifica. Tom vuole ottenere il post recente per ogni autore in un sito wordpress. Nella mia mente è trascurabile per l'analisi se un autore fa più di un post al secondo. Wordpress dovrebbe persino proibirlo con il suo rilevamento di spam doppio post. So per esperienza personale che c'è un vantaggio davvero significativo nelle prestazioni facendo un gruppo così sporco con MySQL. Ma se sai cosa fai, allora puoi farlo! Ho gruppi così sporchi nelle app di cui sono professionalmente responsabile. Qui ho tabelle con alcune milioni di righe che richiedono 5-15 secondi invece di 100++ secondi.
Può essere utile per alcuni pro e contro: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
Ma se qui c'è più di un post al secondo per un autore, otterrai più di una riga e non l'unico ultimo .
Ora puoi girare di nuovo la ruota e ricevere il post con l'Id
più alto . Anche qui non è almeno garantito che tu ottenga davvero l'ultimo.