Maison > Article > base de données > Pourquoi la clause ORDER BY est-elle appliquée après la clause GROUP BY dans MySQL ?
Ordre MySQL avant Group By
Dans MySQL, lors de l'exécution d'une requête impliquant à la fois les clauses ORDER BY et GROUP BY, il est important de noter que la clause ORDER BY est appliquée après la clause GROUP BY. Cela signifie que les résultats sont d'abord regroupés puis triés, ce qui peut ne pas être le comportement souhaité.
Problème :
Considérez la requête suivante :
SELECT wp_posts.* FROM wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' GROUP BY wp_posts.post_author ORDER BY wp_posts.post_date DESC
Cette requête a pour but de récupérer le dernier post pour chaque auteur et de regrouper les résultats par auteur. Cependant, la clause ORDER BY est appliquée après la clause GROUP BY, ce qui entraîne le classement des résultats une fois le regroupement effectué.
Solution :
Pour résoudre ce problème problème, la requête peut être modifiée pour effectuer le classement avant le regroupement :
SELECT wp_posts.* FROM wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' ORDER BY wp_posts.post_date DESC GROUP BY wp_posts.post_author
Cette requête révisée classe d'abord les résultats par date de publication dans l'ordre décroissant avant d'effectuer le regroupement par auteur. Le résultat est que le dernier message de chaque auteur sera récupéré et placé en premier dans l'ensemble de résultats.
Solution alternative (pour les bases de données non MySQL) :
Dans bases de données qui ne prennent pas en charge le tri avant le regroupement, telles que SQL Server et PostgreSQL, une solution alternative peut être utilisée :
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
Cette requête utilise une sous-requête pour identifier la date de publication maximale pour chaque auteur, puis la rejoint jeu de résultats avec la table principale wp_posts pour récupérer les données de publication réelles. Notez que cette solution peut renvoyer plusieurs lignes pour les auteurs ayant plusieurs publications à la même date, un filtrage supplémentaire peut donc être nécessaire en fonction des exigences spécifiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!