总和前10个值

时间:2015-02-17 13:09:07

标签: mysql group-by sum

我已经搜索过了,我知道之前已经有过这样的问题,但我正在努力探索我能做什么/做不到的事情。

我的自行车俱乐部每次骑车人参加比赛时都会记录比赛结果。每个结果都获得积分 - 第一名50分,第二名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

我正在尝试从结果表中提取每个riderid的前10个点的总和。

(实际的数据库有点复杂,有一个用于骑手名称/骑手id的表格,还有一个比赛表,所以我们可以显示每个比赛的结果等但我只想让基本的联赛表查询先工作全部)

所以我想提取每位骑手前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我更改了我的表的列名,但它似乎总结了所有结果,而不是每个骑手的前10名。

或者我可以为每个骑手ID发出一个查询。我觉得不好?

Subquerying是一个问题,因为我不能限制内部查询?

运行一个作业(手动或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;

但是,我无法看到接下来需要做什么才能获得每riderid个前10个结果的总和?

1 个答案:

答案 0 :(得分: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;