Group by - переопределение поведения по умолчанию для решающей строки под каждой группой в результате - PullRequest
0 голосов
/ 28 ноября 2010

Продолжая дальше от этого вопроса Запрос, чтобы найти статьи с наибольшим рейтингом в каждой категории -

Рассмотрим ту же таблицу -

id | category_id | rating
---+-------------+-------
 1 |           1 |     10
 2 |           1 |      8
 3 |           2 |      7
 4 |           3 |      5
 5 |           3 |      2
 6 |           3 |      6

Есть таблица статей,с полями id, rating (целое число от 1 до 10) и category_id (целое число, представляющее, к какой категории он принадлежит).И если у меня одна и та же цель - получить статьи с самым высоким рейтингом в каждом запросе (это должен быть результат): -

Желаемый результат

id | category_id | rating
---+-------------+-------
 1 |           1 |     10
 3 |           2 |      7
 6 |           3 |      6

Расширение исходного вопроса
Но выполнение следующего запроса -

SELECT id, category_id, max( rating ) AS max_rating 
FROM `articles`
GROUP BY category_id

приводит к следующему, где все, кроме поля id, соответствует желаемому.Я знаю, как сделать это с помощью подзапроса - как ответили на тот же вопрос - Использование подзапроса .

id  category_id     max_rating
1    1                10
3    2                7
4    3                6

В общих терминах
Без учета сгруппированныхстолбец (category_id) и вычисляемые столбцы (столбцы, возвращающие результаты агрегатной функции, такие как SUM(), MAX() и т. д. - в данном случае max_rating), значения, возвращаемые в других полях, представляют собой просто первую строку под каждымсгруппированный набор результатов (в данном случае сгруппированный по category_id).Например, запись с id = 1 является первой в таблице под category_id 1 (id 1 и 2 под category_id 1), поэтому она возвращается.

Мне просто интересно, нельзя ли как-то преодолеть это поведение по умолчанию, чтобы вернуть строки на основе условий?Если mysql может выполнять вычисления для каждого сгруппированного набора результатов (выполняет подсчет MAX() и т. Д.), То почему он не может вернуть строку, соответствующую максимальному рейтингу.Разве невозможно сделать это в одном запросе без подзапроса?Это выглядит для меня как частое требование.

Обновление
Я также не мог понять, чего я хочу от решения Naktibalda.И еще раз хочу сказать, я знаю, как сделать это, используя подзапрос, как снова ответил OMG Ponies.

1 Ответ

1 голос
/ 28 ноября 2010

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

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
...