SQL: использование GROUP BY и MAX для нескольких столбцов - PullRequest
10 голосов
/ 28 октября 2010

Эй, у меня проблема с запросом SQL.Давайте возьмем данные этого примера

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

Я хочу вернуть лучший элемент для каждой категории (при этом attrib1 имеет приоритет над attrib2)

Очевидно, "SELECT catID, MAX (attrib1), MAX(attrib2) FROM test_table GROUP BY catID "не работает, поскольку он вернет 10 и 10 для 1-го кота.

Так что в любом случае MySQL нужно указать максимальное значение из строки attrib2, но учитывать только тегде attrib1 также является максимальным значением?т.е. вернуть следующие данные

 catID  attrib1  attrib2
   1       10       7   
   2       18      15

Ответы [ 4 ]

6 голосов
/ 28 октября 2010

Вы можете получить лучшие значения attrib1, а затем объединить значения attrib2 и получить лучшие из них для каждого значения 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
1 голос
/ 28 октября 2010

Использование:

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
1 голос
/ 28 октября 2010
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)
0 голосов
/ 28 октября 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...