2010-10-28 12 views
7

Hej, mam problem z zapytaniem SQL. Weźmy ten przykład daneSQL: Używanie GROUP BY i MAX w wielu kolumnach

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

chcę wrócić najlepszą pozycję dla każdej kategorii (z attrib1 mający pierwszeństwo przed attrib2)

Oczywiście, „SELECT CatID, MAX (attrib1), MAX (attrib2) FROM test_table GROUP BY catID "nie działa, ponieważ zwróci 10 & 10 dla pierwszego kota.

Czy jest tak, aby powiedzieć MySQL, aby wybrać maksymalną wartość z wiersza attrib2, ale uwzględnia tylko te, w których attrib1 jest również wartością maksymalną? czyli powrót następujące dane

catID attrib1 attrib2 
    1  10  7 
    2  18  15 

Odpowiedz

6

można uzyskać najlepsze wartości attrib1, a następnie wziąć udział w wartości attrib2 i uzyskać najlepsze z tych, dla każdego Wartość attrib1:

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

Dzięki za wszystkie szybkie odpowiedzi chłopaki. Fajnie jest też zobaczyć różne sposoby robienia tego. – Charles

+0

Czy to działa? 3 zwracane wartości powinny być tymi z różnych wierszy. – 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

Zastosowanie:

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