Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL Ordina prima di Raggruppa per

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.