Maison  >  Article  >  base de données  >  Pourquoi la clause ORDER BY est-elle appliquée après la clause GROUP BY dans MySQL ?

Pourquoi la clause ORDER BY est-elle appliquée après la clause GROUP BY dans MySQL ?

DDD
DDDoriginal
2024-11-13 00:20:02832parcourir

Why is the ORDER BY Clause Applied After the GROUP BY Clause in 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!

Déclaration:
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