在计算用户变量之前,使用force索引确保表按groupby和order by排序

bsxbgnwa  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(268)

我想把第n行加起来。
我正在计算一个自行车联赛表,在一个项目中,第一快的车手得到50分,第二快的49分,以此类推。。。。整个联盟共有10个项目,但只有一个车手的8个最好的结果被使用(这意味着一个车手可以错过2个项目没有一个灾难性的下降领导板)首先,我需要一个表格,每个车手的结果从联盟中的所有事件被分组在一起,并按最高点的顺序列出,然后计算一个序列号,这样我就可以求出8或更少的最佳结果。所以我用这个表格选择:

set @r := 0, @rn := 0 ;
SELECT 
t.*,
@rn := if(@r = t.id_rider, @rn + 1, 1) as seqnum,
@r :=  t.id_rider as dummy_rider
from results as t 
ORDER BY t.id_rider, t.points desc

table在哪里 results 视图如下:

SELECT 
        a.id_rider,
        b.id_event,
        b.race_no,
        b.id_race,
        b.id_race_type,
        b.`position`,
        c.id_league,
        (51 - b.`position`) AS points
    FROM
    wp_dtk_start_sheet a
    JOIN wp_dtk_position_results b ON a.id_event = b.id_event AND a.race_no = b.race_no
    JOIN wp_dtk_league_races c ON b.id_race = c.id_race
    WHERE
    c.id_league = 1
    AND b.`position` IS NOT NULL

这不起作用 seqnum 所有结果为1。如果我将视图表导出到excel中,并用相同的列和数据 Package 一个测试表,它就可以工作了。我认为问题是这张table没有按顺序排列 ORDER BY t.id_rider, t.points desc 在运行变量之前
此参考:https://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ 声明“这种技术几乎是不确定的,因为它依赖于你和我不能直接控制的东西,比如mysql决定使用哪些索引进行分组”
此引用建议尝试强制索引使用 id_rider 所以我试着:

set @r := 0, @rn := 0 ;
SELECT 
a.id_rider, 
c.id_league, 
(51- b.`position`) as points,
@rn := if(@r = a.id_rider, @rn + 1, 1) as seqnum,
@r :=  a.id_rider as 'set r'
from wp_dtk_start_sheet as a force index (id_rider)
join wp_dtk_position_results as b on a.id_event = b.id_event and a.race_no = b.race_no
join wp_dtk_league_races as c on b.id_race = c.id_race
where c.id_league = 1 and b.`position` is not null   
ORDER BY a.id_rider, points desc

这不起作用,我得到seqnum=1的所有行像以前一样
我的表格结构如下:
表a-wp\U dtk\U启动表

表b-wp\U dtk\U位置\U结果

表c-wp\U dtk\U联赛

这个堆栈覆盖的答案也非常有用,但也有同样的问题:总和前10个值
有人能帮忙吗?也许我走错了路?

r7knjye2

r7knjye21#

如果您使用窗口函数,解决方案将更加清晰。这允许您为行编号指定每个组中的行顺序。

SELECT t.*
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY id_rider ORDER BY points DESC) AS seqnum
  FROM results
) AS t
WHERE t.seqnum <= 8;

mysql中对窗口函数的支持是在版本8.0中引入的,因此您可能需要升级。但自2018年以来,它一直是mysql产品的一部分。

相关问题