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

0

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

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

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() подсчет и т.д.), То почему он не может вернуть строку, соответствующую максимальному рейтингу. Разве это невозможно сделать в одном запросе без подзапроса? Это выглядит как частое требование.

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

Теги:
aggregate-functions
override
greatest-n-per-group

1 ответ

1

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню