Récupération du dernier message par auteur dans MySQL : utiliser JOIN au lieu de trier par avant, grouper par
Lorsque vous essayez de récupérer le dernier message pour chaque auteur dans une base de données, l'approche initiale utilisant une clause ORDER BY avant GROUP BY dans MySQL donne souvent des résultats indésirables. Cependant, l'utilisation d'une sous-requête pour trier les lignes avant le regroupement peut être une solution potentielle.
Pourquoi trier par avant de regrouper par peut être problématique
Considérez l'exemple de requête :
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
Bien que cette requête vise à regrouper les publications par auteur et à renvoyer la dernière publication pour chacune, elle peut échouer lorsqu'il y a plusieurs publications avec le même date_post. Dans de tels cas, l'ordre dans lequel les messages sont renvoyés au sein de chaque groupe d'auteurs devient imprévisible, conduisant à des résultats incohérents.
Utiliser une sous-requête pour résoudre le problème
Le modèle proposé La solution à ce problème consiste à utiliser une sous-requête comme suit :
SELECT wp_posts.* FROM ( SELECT * FROM wp_posts ORDER BY wp_posts.post_date DESC ) AS wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' GROUP BY wp_posts.post_author
En utilisant cette sous-requête, les publications sont d'abord classées par leur post_date par ordre décroissant. La table de sous-requête résultante sert ensuite de source pour la requête principale, garantissant que les dernières publications sont placées en haut de chaque groupe d'auteurs avant le regroupement.
Une approche alternative avec JOIN
Une autre approche efficace pour récupérer le dernier message par auteur consiste à utiliser une opération JOIN. La requête suivante illustre cette méthode :
SELECT p1.* FROM wp_posts p1 INNER JOIN ( SELECT max(post_date) MaxPostDate, post_author FROM wp_posts WHERE post_status='publish' AND post_type='post' GROUP BY post_author ) p2 ON p1.post_author = p2.post_author AND p1.post_date = p2.MaxPostDate WHERE p1.post_status='publish' AND p1.post_type='post' order by p1.post_date desc
Cette requête comporte deux étapes :
Conclusion
Bien que l'utilisation d'une sous-requête pour trier les lignes avant le regroupement puisse être une solution efficace pour récupérer le dernier message par auteur, ce n'est pas le seule approche disponible. L'opération JOIN fournit une méthode alternative à la fois efficace et produisant des résultats fiables.
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!