Maison >base de données >tutoriel mysql >Comment trier les résultats avant de les regrouper dans MySQL ?
Ordre MySQL avant Group By
Dans MySQL, l'exécution d'une clause GROUP BY classe normalement les résultats une fois les groupes formés. Cependant, il existe des scénarios dans lesquels vous souhaitez trier les résultats avant de les regrouper.
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 vise à trouver le dernier article de chaque auteur, puis à regrouper les résultats. Cependant, le problème est qu'il trie les résultats après le regroupement, pas avant.
Solution
Pour trier les résultats avant le regroupement, vous pouvez utiliser l'approche 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 HAVING wp_posts.post_date = MAX(wp_posts.post_date) ORDER BY wp_posts.post_date DESC
La clause HAVING garantit que seul le dernier article de chaque auteur est sélectionné avant regroupement.
Solution alternative
Dans les cas où la clause HAVING n'est pas réalisable, comme dans Postgres ou SQL Server, vous pouvez utiliser la solution alternative suivante :
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
Cette requête utilise une sous-requête pour trouver la date de publication maximale pour chaque auteur, puis la joint à la table d'origine pour récupérer la publication réelle enregistrements.
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!