用于确定高尔夫应用程序中的T恤顺序的SQL

时间:2012-05-15 17:34:51

标签: java sql database sqlite

我正在开发一个包含记分卡系统的高尔夫应用程序。我正在为数据库中的每个玩家存储每个分数,我需要提出一个查询来确定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。

我的表格结构如下:

  • 玩家(玩家ID和玩家姓名)
  • 轮次(圆形ID,课程ID)
  • 得分(轮次ID,球员ID,球门号码和得分)

3 个答案:

答案 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