我正在开发一个包含记分卡系统的高尔夫应用程序。我正在为数据库中的每个玩家存储每个分数,我需要提出一个查询来确定T恤顺序。因此,例如,如果球员打了3个洞并且得分看起来像这样......
Player 1 2 3
--------- - - -
Player 1: 3, 4, 3
Player 2: 2, 3, 3
Player 3: 2, 4, 3
...然后订单需要看起来像这样......
1.) Player 2
2.) Player 3
3.) Player 1
......因此,与对手的得分相比,球员的得分将被排序。那有意义吗?这甚至可以用于查询,还是应该编写一个函数来解析代码中的二维数组?在这种情况下我使用Java。
我的表格结构如下:
答案 0 :(得分:3)
我可以看到一个解决方案,它使用windows函数row_number()和数据库中的附加列来进行每个级别的排序(或SQL Server中的递归CTE)。但是,SQLite不支持此功能。
以下是我对实施解决方案的建议,但没有进行大量的后退查询:
(1)为第一个发球台分配T恤顺序。
(2)对于每个下一个发球台,请查看上一个得分和之前的发球顺序:
(3)通过按最高分DESC和先前的T恤顺序ASC排序来循环分析先前的分数来分配新的T恤顺序。
因为你每轮只有几个玩家,所以在app层中这样做是合理的。但是,如果您有一个支持窗口功能的数据库,那么您可以更轻松地执行仅数据库解决方案。
我无法抗拒。这里有一些代码可以用表来存储订单。你需要循环,每洞一次:
create table ThisOrder (
ThisOrderId int primary key autoincrement,
RoundId int,
Hole int,
PlayerId int
)
按照某个顺序将每个玩家初始化。
然后,在表格中为每个洞插入新行:
insert into ThisOrder(RoundId, HoleId, PlayerId)
select s.RoundId, s.Hole+1, s.PlayerId
from Scores s join
ThisOrder to
on s.PlayerId = to.PlayerId and
s.RoundId = to.RoundId and
s.Hole = to.Hole
order by s.Score DESC, to.Order ASC
你需要为每个洞打一次这个,减去一个。
然后按以下顺序排列:
select *
from ThisOrder
where roundid = <roundid> and hole = <thehole>
order by ThisOrderId
答案 1 :(得分:0)
所以,你需要总结每个玩家当前洞前的每个洞的得分,然后按照总和得分对玩家ID列表进行排序。
这样的事情应该有效:
SELECT SUM(score) AS score, player_id FROM Scores WHERE round_id=$current_round AND hole_number<$current_hole GROUP BY player_id ORDER BY score;
这会产生一个包含两列(player_id和得分)的结果表,其中包含的玩家数量与玩家一样多,从而使玩家得分最高。
答案 2 :(得分:0)
此查询返回玩家得分最低的最高洞,并按顺序返回:
SELECT * FROM Players p
ORDER BY
(SELECT MAX(s1.hole_number) FROM Scores s1
LEFT JOIN Scores s2
ON s2.round_id = s1.round_id AND
s1.hole_number = s2.hole_number AND
s2.score < s1.score
WHERE s1.player_id = p.player_id AND
s1.round_id = 1 AND s2.round_id IS NULL) DESC