Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL trier par avant grouper par

Utiliser un ORDER BY dans une sous-requête n'est pas la meilleure solution à ce problème.

La meilleure solution pour obtenir le max(post_date) par auteur consiste à utiliser une sous-requête pour renvoyer la date maximale, puis à la joindre à votre table à la fois sur post_author et la date max.

La solution devrait être :

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

Si vous disposez des exemples de données suivants :

CREATE TABLE wp_posts
    (`id` int, `title` varchar(6), `post_date` datetime, `post_author` varchar(3))
;

INSERT INTO wp_posts
    (`id`, `title`, `post_date`, `post_author`)
VALUES
    (1, 'Title1', '2013-01-01 00:00:00', 'Jim'),
    (2, 'Title2', '2013-02-01 00:00:00', 'Jim')
;

La sous-requête va retourner la date max et l'auteur de :

MaxPostDate | Author
2/1/2013    | Jim

Ensuite, puisque vous rejoignez cela dans le tableau, sur les deux valeurs, vous renverrez tous les détails de ce message.

Voir SQL Fiddle avec démo .

Pour développer mes commentaires sur l'utilisation d'une sous-requête pour renvoyer précisément ces données.

MySQL ne vous oblige pas à GROUP BY chaque colonne que vous incluez dans le SELECT liste. Par conséquent, si vous ne faites que GROUP BY une colonne mais renvoie 10 colonnes au total, il n'y a aucune garantie que les autres valeurs de colonne qui appartiennent au post_author qui est retourné. Si la colonne n'est pas dans un GROUP BY MySQL choisit la valeur à renvoyer.

L'utilisation de la sous-requête avec la fonction d'agrégation garantira que l'auteur et la publication corrects sont renvoyés à chaque fois.

En remarque, alors que MySQL vous permet d'utiliser un ORDER BY dans une sous-requête et permet d'appliquer un GROUP BY à toutes les colonnes du SELECT listez ce comportement n'est pas autorisé dans d'autres bases de données, y compris SQL Server.