2010-10-28 7 views
7

Hé, j'ai un problème avec une requête SQL. Permet de prendre cet exemple les donnéesSQL: Utilisation de GROUP BY et MAX sur plusieurs colonnes

itemID catID attrib1 attrib2 
    1  1  10  5 
    2  1  10  7 
    3  1  5  10 
    4  2  18  15 

Je veux revenir le meilleur élément pour chaque catégorie (avec attrib1 ayant priorité sur attrib2)

De toute évidence, « SELECT catID, MAX (attrib1), MAX (attrib2) DE test_table GROUP BY catID "ne fonctionne pas car il retournera 10 & 10 pour le 1er chat.

Alors, est-il possible de dire à MySQL de sélectionner la valeur maximale de la ligne attrib2, mais ne considérer que celles où attrib1 est aussi la valeur maximale? à-dire renvoyer les données suivantes

catID attrib1 attrib2 
    1  10  7 
    2  18  15 

Répondre

6

Vous pouvez obtenir les meilleures valeurs de attrib1, puis se joindre aux valeurs attrib2 et obtenir le meilleur de ceux pour chaque attrib1 valeur:

select t2.catID, t2.attrib1, max(t2.attrib2) 
from 
(
    select catID, max(attrib1) as attrib1 
    from test_table 
    group by catID 
) t1 
inner join test_table t2 on t2.catID = t1.catID and t2.attrib1 = t1.attrib1 
group by t2.catID, t2.attrib1 
+0

Merci pour toutes les réponses rapides les gars. C'est agréable de voir aussi différentes façons de le faire. – Charles

+0

Est-ce que cela fonctionne? les 3 valeurs renvoyées doivent être celles de différentes lignes. – Ryo

1
SELECT tt.catId, tt.attrib1, MAX(tt.attrib2) 
FROM test_table tt 
GROUP BY tt.catID, tt.attrib1 
WHERE tt.attrib1 = (SELECT MAX(t2.attrib1) FROM test_table t2 WHERE t2.catID = tt.catID) 
-1
SELECT catID, max1, max2 FROM 
((SELECT Max(attrib1) as max1, catID GROUP BY attrib1) as t1 
INNER JOIN 
(SELECT MAX(attrib2) as max2, catID GROUP BY attrib2) as t2 
ON t1.catID = t2.catID) as t3 
1

Utilisation:

SELECT x.catid, 
     x.max_attrib1 AS attrib1, 
     (SELECT MAX(attrib2) 
      FROM YOUR_TABLE y 
     WHERE y.catid = x.catid 
      AND y.attrib1 = x.max_attrib1) AS attrib2 
    FROM (SELECT t.catid, 
       MAX(t.attrib1) AS max_attrib1 
      FROM YOUR_TABLE t 
     GROUP BY t.catid) x