2010-11-27 44 views
0

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.

Répondre

1

Utilisation:

SELECT x.id, 
     x.category_id, 
     x.rating 
    FROM YOUR_TABLE x 
    JOIN (SELECT t.category_id, 
       MAX(t.rating) AS max_rating 
      FROM YOUR_TABLE t 
     GROUP BY t.category_id) y ON y.category_id = x.category_id 
           AND y.max_rating = x.rating