每个玩家的前3个结果并按总数排序

时间:2014-10-10 14:01:30

标签: mysql sql greatest-n-per-group

我需要得出一个结果,显示每个玩家的前3个结果的总和,并按总和对其进行排序

示例表:

David = 12   Mike = 17   John = 20   Bill = 20
David = 12   Mike = 16   John = 18   Bill = 20
David = 11   Mike = 15   John = 16
David = 10   Mike = 14   John = 16
David = 10               John = 15

结果需要显示如下:

John = 54
Mike = 50
Bill = 40
David = 35

我已经为所有活动排名(简单):

SELECT playerName, SUM(`eventPoints`)
FROM `eventresults`
GROUP BY `playername`
ORDER BY SUM(`eventPoints`) DESC

我想用PHP代码执行以下操作:

  1. 创建一个名为top3Events的表
  2. 启动时TRUNCATE top3Events
  3. 在表eventResults
  4. 上阅读上述查询结果
  5. 对每个新玩家名称使用计数器和重置
  6. 当计数器< = 3
  7. 时INSERT INTO top3Events

    运行此查询:

    SELECT playerName, SUM(`eventPoints`)
    FROM `top3Events`
    GROUP BY `playername`
    ORDER BY SUM(`eventPoints`) DESC
    

    不确定这是否是使用此

    的正确方法

1 个答案:

答案 0 :(得分:0)

我想没有人想要解决这个问题。评论中有一个很好的链接,但我可能会使用SQL和代码(PHP)的混合方法来解决这个问题。我的解决方案假设playerName是玩家的主键,并且没有非常多的玩家

我首先执行此查询(最好从players表中获取(如果有):

SELECT DISTINCT `playerName`
FROM `eventResults`

我然后循环查询结果,构建一系列查询UNION

SELECT `sub`.`playerName`,
    SUM(`sub`.`eventPoints`) AS `pointsSum`
FROM (
    SELECT `playerName`,
        `eventPoints`
    FROM `eventResults`
    WHERE `playerName` = '$playerName'
    ORDER BY `eventPoints` DESC
    LIMIT 3
) AS `sub`

如果每次查看时都不需要执行计算,则可以将结果存储在摘要表中,并在查看时使用它。


使用示例中的名称,生成的查询将如下所示:

SELECT `sub`.`playerName`,
    SUM(`sub`.`eventPoints`) AS `pointsSum`
FROM (
    SELECT `playerName`,
        `eventPoints`
    FROM `eventResults`
    WHERE `playerName` = 'David'
    ORDER BY `eventPoints` DESC
    LIMIT 3
) AS `sub`

UNION
SELECT `sub`.`playerName`,
    SUM(`sub`.`eventPoints`) AS `pointsSum`
FROM (
    SELECT `playerName`,
        `eventPoints`
    FROM `eventResults`
    WHERE `playerName` = 'Mike'
    ORDER BY `eventPoints` DESC
    LIMIT 3
) AS `sub`

UNION
SELECT `sub`.`playerName`,
    SUM(`sub`.`eventPoints`) AS `pointsSum`
FROM (
    SELECT `playerName`,
        `eventPoints`
    FROM `eventResults`
    WHERE `playerName` = 'John'
    ORDER BY `eventPoints` DESC
    LIMIT 3
) AS `sub`

UNION
SELECT `sub`.`playerName`,
    SUM(`sub`.`eventPoints`) AS `pointsSum`
FROM (
    SELECT `playerName`,
        `eventPoints`
    FROM `eventResults`
    WHERE `playerName` = 'Bill'
    ORDER BY `eventPoints` DESC
    LIMIT 3
) AS `sub`

ORDER BY `pointsSum` DESC