Extension plus de cette question Query to find top rated article in each category -Groupe par - comportement par défaut Redéfinition de décider ligne sous chaque groupe dans le résultat
Considérons la même table -
id | category_id | rating
---+-------------+-------
1 | 1 | 10
2 | 1 | 8
3 | 2 | 7
4 | 3 | 5
5 | 3 | 2
6 | 3 | 6
Il y a un des articles de table, avec champs id, rating (un entier compris entre 1 et 10) et category_id (un entier représentant la catégorie à laquelle il appartient). Et si j'ai le même but d'obtenir le top des articles les mieux notées chaque requête (cela devrait être le résultat): -
Résultat souhaité
id | category_id | rating
---+-------------+-------
1 | 1 | 10
3 | 2 | 7
6 | 3 | 6
Extension de la question originale
Mais, exécutant la requête suivante -
SELECT id, category_id, max(rating) AS max_rating
FROM `articles`
GROUP BY category_id
résultats dans ce qui suit où tout, à l'exception du id
f ield, est comme désiré. Je sais comment le faire avec une sous-requête - comme répondu dans la même question - Using subquery.
id category_id max_rating
1 1 10
3 2 7
4 3 6
En termes génériques
Hors la colonne groupée (category_id
) et les colonnes évaluées (colonnes de résultats retour fonction d'agrégation comme SUM()
, MAX()
etc. - dans ce cas max_rating
), les valeurs retournées dans le les autres champs sont simplement la première ligne sous chaque ensemble de résultats groupés (regroupés par category_id
dans ce cas). Par exemple. l'enregistrement avec id
= 1 est le premier dans la table sous category_id
1 (id
1 et 2 sous category_id
1) donc il est retourné.
Je me demande simplement s'il n'est pas possible de surmonter ce comportement par défaut pour renvoyer des lignes en fonction des conditions? Si mysql peut effectuer un calcul pour chaque ensemble de résultats groupés (fait MAX()
en comptant etc.) alors pourquoi ne peut-il pas retourner la ligne correspondant à la note maximale. Est-il impossible de le faire dans une seule requête sans sous-requête? Cela me semble être une exigence fréquente.
Mise à jour
Je ne pouvais pas comprendre ce que je veux de la solution de Naktibalda aussi. Et juste pour mentionner encore, je sais comment faire ceci en utilisant une sous-requête, comme encore une fois répondu par OMG Ponies.