Maison > base de données > tutoriel mysql > Comment récupérer efficacement la dernière publication de chaque auteur dans MySQL ?

Comment récupérer efficacement la dernière publication de chaque auteur dans MySQL ?

DDD
Libérer: 2024-12-15 20:10:14
original
490 Les gens l'ont consulté

How to Efficiently Retrieve the Latest Post for Each Author in MySQL?

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
Copier après la connexion

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 
Copier après la connexion

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
Copier après la connexion

Cette requête comporte deux étapes :

  1. Une sous-requête trouve la post_date maximale et le post_author correspondant pour chaque auteur.
  2. La requête principale rejoint la table contenant les publications avec le résultat de la sous-requête à la fois sur post_date et post_author, récupérant ainsi la dernière publication pour chaque auteur.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal