Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL Trier avant Grouper par

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

MODIF :

Après quelques commentaires, j'ai décidé d'ajouter quelques informations supplémentaires.

L'entreprise dans laquelle je travaille utilise également Postgres et surtout SQL Server. Ces bases de données ne permettent pas de telles requêtes. Je sais donc qu'il existe une autre façon de procéder (j'écris une solution ci-dessous). Vous devez également savoir ce que vous faites si vous ne regroupez pas toutes les colonnes traitées dans la projection ou si vous n'utilisez pas de fonctions d'agrégation. Sinon, laissez-le être !

J'ai choisi la solution ci-dessus, car c'est une question spécifique. Tom souhaite obtenir la publication récente de chaque auteur sur un site wordpress. Dans mon esprit, c'est négligeable pour l'analyse si un auteur fait plus d'un message par seconde. Wordpress devrait même l'interdire par sa détection de spam-double post. Je sais par expérience personnelle qu'il y a un avantage vraiment significatif en termes de performances en faisant un groupe aussi sale avec MySQL. Mais si vous savez ce que vous faites, alors vous pouvez le faire ! J'ai de tels groupes sales dans les applications dont je suis professionnellement responsable. Ici, j'ai des tables avec quelques millions de lignes qui nécessitent 5 à 15 secondes au lieu de 100++ secondes.

Peut être utile sur certains avantages et inconvénients :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

Mais s'il y a plus d'un message par seconde pour un auteur, vous obtiendrez plus d'une ligne et pas la seule dernière .

Maintenant, vous pouvez à nouveau faire tourner la roue et obtenir le message avec le Id le plus élevé . Même ici, il n'est au moins pas garanti que vous obteniez vraiment le dernier.