我需要得出一个结果,显示每个玩家的前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代码执行以下操作:
运行此查询:
SELECT playerName, SUM(`eventPoints`)
FROM `top3Events`
GROUP BY `playername`
ORDER BY SUM(`eventPoints`) DESC
不确定这是否是使用此
的正确方法答案 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