2010-10-28 44 views
7

Xin chào, tôi gặp sự cố với Truy vấn SQL. Cho phép lấy một ví dụ dữ liệu nàySQL: Sử dụng GROUP BY và MAX trên nhiều cột

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

Tôi muốn quay trở lại mục tốt nhất cho mỗi thể loại (với attrib1 có ưu tiên hơn attrib2)

Rõ ràng, "SELECT CatID, MAX (attrib1), MAX (attrib2) TỪ test_table GROUP BY catID "không hoạt động vì nó sẽ trả lại 10 & 10 cho con mèo thứ nhất.

Vì vậy, có anyway để nói cho MySQL để chọn giá trị tối đa từ attrib2 hàng nhưng chỉ xem xét những người mà attrib1 cũng là giá trị tối đa? tức là trả lại dữ liệu sau

catID attrib1 attrib2 
    1  10  7 
    2  18  15 

Trả lời

6

Bạn có thể nhận các giá trị attrib1 tốt nhất, và sau đó tham gia vào các giá trị attrib2 và tận dụng tốt nhất của những người cho mỗi attrib1 value:

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

Cảm ơn tất cả những người trả lời nhanh. Thật tuyệt khi thấy nhiều cách khác nhau để thực hiện nó. – Charles

+0

Tính năng này có hoạt động không? 3 giá trị trả về phải là giá trị của các hàng khác nhau. – 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

Sử dụng:

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 
Các vấn đề liên quan