2015-02-17 3 views
2

Я обыскал, и я знаю, что это было задано раньше, но я изо всех сил пытаюсь размахивать тем, что я могу/не могу сделать.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?

+0

Вы видели эту статью? http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ –

+0

Добро пожаловать в StackOverflow. Вы задали хороший вопрос и хорошо его представили. (Получение ответа от Гордона всегда является хорошим знаком!) –

+0

Благодарим вас за теплый прием и быстрые ответы. – freester

ответ

2

В MySQL, самый простой способ сделать это, вероятно, использовать переменные:

SELECT riderid, sum(points) 
FROM (SELECT r.*, 
      (@rn := if(@r = riderid, @rn + 1, 
         if(@r := riderid, 1, 1) 
         ) 
      ) as seqnum 
     FROM results r CROSS JOIN 
      (SELECT @r := 0, @rn := 0) as wnw 
     ORDER BY riderid, points DESC 
    ) r 
WHERE seqnum <= 10 
GROUP BY riderid; 
+0

Спасибо за быстрый ответ. Я думаю, что по сути это тот, который я пробовал из ссылки в моем первоначальном вопросе, и, похоже, он суммирует все результаты, а не только десятку. – freester

+0

@freester. , , Это должно суммировать только первые десять баллов для каждого гонщика, теперь, когда я исправил опечатку. –

+0

Привет. Это сработало после исправления ошибки sql - я отредактировал ваш ответ после строки (SELECT @r: = 0, @rn: = 0) с помощью wnw – freester

Смежные вопросы