gpt4 book ai didi

mysql 总结每个玩家的前 5 名得分并进行排名

转载 作者:行者123 更新时间:2023-11-28 23:16:10 27 4
gpt4 key购买 nike

我想做一个排名,将最好的 5 名球员的成绩相加并放在一个排名中。玩家有或多或少的 5 分。

现在我有以下查询:

set @count:=0, @player:=''; 
SELECT SEIZOEN
, WEDSTRIJDTYPE
, ATLEET_ID
, GROEP_NAAM
, GROEP_OMS
, SUM(PUNTEN_WC) as WC_RESULT
FROM
( SELECT ATLEET_ID
, PUNTEN_WC
, SEIZOEN
, WEDSTRIJDTYPE
, GROEP_NAAM
, GROEP_OMS
FROM
( SELECT PUNTEN_WC
, SEIZOEN
, WEDSTRIJDTYPE
, GROEP_NAAM
, GROEP_OMS
, @count := if (@player != ATLEET_ID,0,@count + 1) as count
, @player := ATLEET_ID as ATLEET_ID
FROM
( SELECT ATLEET_ID
, PUNTEN_WC
, k.SEIZOEN
, k.WEDSTRIJDTYPE
, g.GROEP_NAAM
, g.GROEP_OMS
FROM RESULTATEN r
LEFT
JOIN KALENDER k
ON r.KALENDER_ID = k.KALENDER_ID
JOIN GROEP_SNB g
ON r.GROEP_NAAM = g.GROEP_NAAM
JOIN SKIER s
ON r.ATLEET_ID = s.SKIER_ID
WHERE k.WEDSTRIJDTYPE = 'Dutch Cup snowboard '
AND k.SEIZOEN = '2016-2017'
order
by ATLEET_ID
, PUNTEN_WC DESC
) x
) y
where count < 6
) z
GROUP
BY ATLEET_ID
ORDER
BY GROEP_NAAM
, WC_RESULT DESC
LIMIT 0,2000;

问题是这个查询没有获取每个玩家的五个最佳分数。

当我运行最内部的查询时,它会很好地对分数进行排序。

SELECT ATLEET_ID
, PUNTEN_WC
, k.SEIZOEN
, k.WEDSTRIJDTYPE
, g.GROEP_NAAM
, g.GROEP_OMS
FROM RESULTATEN r
LEFT
JOIN KALENDER k
ON r.KALENDER_ID = k.KALENDER_ID
JOIN GROEP_SNB g
ON r.GROEP_NAAM = g.GROEP_NAAM
JOIN SKIER s
ON r.ATLEET_ID = s.SKIER_ID
WHERE k.WEDSTRIJDTYPE = 'Dutch Cup snowboard '
AND k.SEIZOEN = '2016-2017'
order
by ATLEET_ID
, PUNTEN_WC DESC

我已经对记录进行了计数,因此我可以将其限制为 5 个中最好的一个。但是麻烦就来了。对于第二个查询,高分仍然正确排序,但计数字段不是 0 到 5?

因此,当我放入第三个查询时,它会在计数字段为 5 时停止,但我希望每个玩家最多获得 5 个分数。

最佳答案

您可以使用此查询对每个人的前 N ​​个值求和:

创建一个简单的测试表并填充它 -

CREATE TABLE Scores
(`id` int, `playerName` varchar(16), `score` int)
;

INSERT INTO Scores
(`id`, `playerName`, `score`)
VALUES
(1, 'Joe', 5),
(2, 'Joe', 5),
(3, 'Joe', 5),
(4, 'Joe', 1),
(5, 'Joe', 10),
(6, 'Joe', 10),
(7, 'Joe', 15),
(8, 'Bob', 5),
(9, 'Bob', 5),
(10, 'Bob', 2),
(11, 'Bob', 10),
(12, 'Bob', 3),
(13, 'Bob', 10),
(14, 'Bob', 20)
;

查询:

SET @score_rank := 0;
SET @current_player = '';
SET @topN = 5;
Select playerName, SUM(score)
From (Select playerName, score,
@score_rank := IF(@current_player = playerName, (@score_rank + 1), 1) AS score_rank,
@current_player := playerName
From Scores
Order By playerName, score DESC) sorted
Where score_rank <= @topN
Group By playerName;

内部查询为两个变量赋值 - @current_player@score_rank。如果 @current_player 值匹配 playerName,它会增加 @score_rank,否则它会将 @score_rank 设置为 1。通过这样做,我们可以为每个玩家只获取前 5 名。外部查询然后将前 5 个分数相加。如果您想对不同的集合(如前 10 名)求和,可以更改 @topN 的值。

上述示例表的结果:

playerName  SUM(score)
---------- ----------
Bob 50
Joe 45

在这里查看:http://rextester.com/CLO11640

关于mysql 总结每个玩家的前 5 名得分并进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43778026/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com