@Dier_Sergio_Great
Отчёт для формы для голосования кино.
Нужно вывести по каждой номинации 5 фильмов с максимальным количеством балов.
Каждая строка таблицы это 1 голос: колонки nomin_id, user_id, film_id
Нужно вывести по каждой номинации 5 фильмов с максимальным количеством балов.
Каждая строка таблицы это 1 голос: колонки nomin_id, user_id, film_id
SELECT count(user_id ) countUser , nomin_id, film_id
FROM votes
GROUP BY film_id , nomin_id
ORDER BY countUser DESC
LIMIT 5;
По идее надо этот запрос таблицы votes
вложить в другой запрос таблицы votes
и проверять есть ли совпадения двух таблиц WHERE EXISTS()
.
Но всего в таблице 25 000 строк запрос выполняется 30 секунд, а потом крах.
Решения вопроса 2
@alexalexes
select A.*
from
(
select B.*,
row_number() over (partition by B.nomin_id order by B.countUser desc) rwnm -- партишином задаем область счета строк, а сортировкой - порядок счета
from
(
SELECT count(user_id) countUser, nomin_id, film_id
FROM votes
GROUP BY film_id , nomin_id
) B
) A
where rwnm <= 5 -- берем по этому количеству от каждого локального счета
См. оконную функцию row_number для MySQL 8+ версия, либо MariaDB. Но учтите, что MySQL 5 не поддерживает оконки, в ней свои костыли есть в виде использования переменных с @.
Но всего в таблице 25 000 строк запрос выполняется 30 секунд, а потом крах.
Индексы на каждый из атрибутов user_id, nomin_id, film_id нужно создать, тогда будет пару сотен миллисекунд выполняться.
Ответы на вопрос 0