【问题标题】:Sum top 5 values in MySQL总结 MySQL 中的前 5 个值
【发布时间】:2012-12-26 23:17:03
【问题描述】:

我有一个 MySQL 表,我在其中存储来自赛车锦标赛的结果,因此每一行都包含 - 在其他数据中 - 每个车手在某场比赛中的位置。我想得到某个驱动程序的前 5 名的总和(例如,如果驱动程序的最佳位置是 1、2、2、4、5,我希望 MySQL 返回 14)。我想要做的是:

SELECT driver, SUM(position)
FROM results
WHERE (race, season, position) IN
   (SELECT race, season, position
    FROM results
    WHERE driver = "Vettel"
    ORDER BY position ASC
    LIMIT 5) 
AND driver = "Vettel"

当然,(种族、赛季、位置)是“结果”表的主键。现在,问题是我不能真正让它工作,因为 MySQL 还不支持在内部子查询中使用 LIMIT。你会怎么做呢?

为了获得额外的积分 - 有没有办法通过单个查询获得每个驱动程序的前 5 个结果的总和,而不是单个驱动程序?

【问题讨论】:

    标签: mysql select group-by sum subquery


    【解决方案1】:

    试试这个:

    SELECT driver, SUM(`position`)
    FROM (SELECT driver, race, season, `position`, 
                 IF(@lastDriver=(@lastDriver:=driver), @auto:=@auto+1, @auto:=1) indx 
          FROM results, (SELECT @lastDriver:=0, @auto:=1) A 
          ORDER BY driver, `position`) AS A  
    WHERE indx <= 5 
    GROUP BY driver ;
    

    【讨论】:

    • 哇,太棒了!非常感谢 - 它就像一个魅力。 :D
    【解决方案2】:

    这是另一种方式...

    SELECT a.season
         , a.driver
         , SUM(points) T5
      FROM
         ( SELECT x.season
                , x.driver
                , x.points
             FROM results x 
             JOIN results y 
               ON (y.season = x.season 
              AND y.driver = x.driver) 
              AND (y.position < x.position OR (y.position = x.position AND y.race < x.race))
            GROUP 
               BY x.season
                , x.driver
                , x.race
           HAVING COUNT(*) <=5
         ) a
     GROUP
        BY season
         , driver;
    

    【讨论】:

    • 干净多了。我认为AND y.race &lt; x.race 必须是&lt;=,但这非常好。
    • 它还按季节分组(OP 没有指定但可能需要)。 @Strawberry,您还可以添加(season, driver, position, race) 上的索引将有助于提高查询效率。
    • 嗯 - 如果出现平局,我会“任意”选择较早的比赛(无论是按字母顺序还是按数字顺序 - 并不重要)。
    • 另外,我的查询中有一个假设 - 退休记录为,例如,位置 99。
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2023-01-24
    • 2020-08-08
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多