Я обыскал, и я знаю, что это было задано раньше, но я изо всех сил пытаюсь размахивать тем, что я могу/не могу сделать.Sum Top 10 Значения
Мой велосипедный клуб записывает результаты гонки каждый раз, когда всадник вошел в гонку. Каждый результат получают очки - 50 за 1, 49 для второго и т.д.
Так таблица выглядит
resultid(pk) | riderid(fk) | leaguepts
1 1 50
2 2 49
3 3 48
4 1 50
5 2 42
6 3 50
7 4 30
...etc
Я пытаюсь извлечь сумму 10 лучших баллов, начисленных за каждый riderid
из таблицы результатов ,
(фактическая база данных немного сложнее с таблицей для идентификатора всадника/идентификатора гонщика, а также таблицы расы, чтобы мы могли отображать результаты каждой гонки и т. Д., Но я просто хочу, чтобы первый запрос таблицы лиги работал сначала из всех)
Итак, я хочу извлечь сумму из 10 лучших лучших результатов для каждого гонщика. Затем отобразите оценку каждого гонщика в нисходящем лиге.
До сих пор я имел успех только с помощью UNION ALL, например.
SELECT sum(points) AS pts from
(
SELECT points from `results`
WHERE riderid = 1
ORDER BY points DESC
LIMIT 10
) as riderpts
UNION ALL
SELECT sum(points) AS pts from
(
SELECT points from `results`
WHERE riderid = 2
ORDER BY points DESC
LIMIT 10
) as riderpts
ORDER BY pts DESC
Но может быть до 90 с лишним всадников, которые зарегистрировались по крайней мере один счет, так этот запрос может быть очень большой.
Я нашел это, похоже, что он должен работать для меня, но это не так. Sum top 5 values in MySQL Я изменил имена столбцов для своей таблицы, но, похоже, суммирует все результаты, а не первую десятку для каждого гонщика.
В качестве альтернативы я мог бы просто задать запрос для каждого идентификатора всадника. Нехорошо, я думаю?
Подзапросы - это проблема, потому что я не могу ограничить внутренний запрос?
Запуск задания (вручную или cron) для периодического обновления таблицы лиг и отображения результатов таблицы?
Редактировать (не уверен, что это правильный этикет, или я должен начать новый поток?). Гордон ответил на вопрос ниже, но тем временем я попытался это сделать для себя, используя одну из приведенных ниже ссылок. Я мог бы получить результаты, возвращаемые первые 10 баллов для каждого гонщика с запросом ниже
set @riderid = '';
set @riderrow = 1;
select riderid, leaguepts, row_number
from
(
select
riderid,
leaguepts,
@riderrow := if(@riderid = riderid, @riderrow + 1, 1) as row_number,
@riderid := riderid as dummy
from wp_tt_results order by riderid, leaguepts desc
) as x where x.row_number <= 10;
НО я не могу видеть то, что мне нужно делать дальше, чтобы получить сумму 10 лучших результатов на riderid
?
Вы видели эту статью? http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ –
Добро пожаловать в StackOverflow. Вы задали хороший вопрос и хорошо его представили. (Получение ответа от Гордона всегда является хорошим знаком!) –
Благодарим вас за теплый прием и быстрые ответы. – freester