对前 10 个值求和
Sum Top 10 Values
我已经搜索过了,我知道以前有人问过这个问题,但我正在努力思考我能做什么/不能做什么。
我的自行车俱乐部记录每次骑手参加比赛的比赛结果。每个结果都会获得积分 - 第一名 50 分,第二名 49 分,依此类推。
所以 table 看起来像
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
我正在尝试从结果 table 中提取每个 riderid
获得的前 10 分的总和。
(实际数据库有点复杂,车手姓名/车手 ID 为 table,还有一场比赛 table,因此我们可以显示每场比赛的结果等,但我只想让基本联盟 table 查询首先工作)
所以我想提取每个骑手的前 10 个最佳分数的总和。然后显示每个骑手的得分,在降级联赛 table.
到目前为止,我只成功使用了 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 我更改了 table 的列名称,但它似乎汇总了所有结果,而不是每个骑手的前 10 名。
或者,我可以针对每个骑手 ID 发出查询。我猜不太好?
子查询是个问题,因为我不能限制内部查询?
运行 定期更新联赛 table 并仅显示 table 结果的作业(手动或 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 个结果的总和
在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;
我已经搜索过了,我知道以前有人问过这个问题,但我正在努力思考我能做什么/不能做什么。
我的自行车俱乐部记录每次骑手参加比赛的比赛结果。每个结果都会获得积分 - 第一名 50 分,第二名 49 分,依此类推。
所以 table 看起来像
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
我正在尝试从结果 table 中提取每个 riderid
获得的前 10 分的总和。
(实际数据库有点复杂,车手姓名/车手 ID 为 table,还有一场比赛 table,因此我们可以显示每场比赛的结果等,但我只想让基本联盟 table 查询首先工作)
所以我想提取每个骑手的前 10 个最佳分数的总和。然后显示每个骑手的得分,在降级联赛 table.
到目前为止,我只成功使用了 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 我更改了 table 的列名称,但它似乎汇总了所有结果,而不是每个骑手的前 10 名。
或者,我可以针对每个骑手 ID 发出查询。我猜不太好?
子查询是个问题,因为我不能限制内部查询?
运行 定期更新联赛 table 并仅显示 table 结果的作业(手动或 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
?
在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;