Продолжение дальше этого вопроса Запрос для поиска статьи с наибольшим рейтингом в каждой категории -
Рассмотрим ту же таблицу -
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.
Использование:
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