我可以看到一个解决方案,它使用 Windows 函数 row_number() 和数据库中的一个附加列来进行每个级别的排序(或 SQL Server 中的递归 CTE)。但是,SQLite 不支持这一点。
这是我在不进行大量向后查询的情况下实施解决方案的建议:
(1) 分配第一个发球台的发球台顺序。
(2) 对于每个下一个发球台,查看上一个得分和上一个发球台顺序:
(3) 通过按最高分数 DESC 和先前的开球顺序 ASC 排序,循环通过先前的分数来分配新的开球顺序。
因为你每轮只有几个玩家,所以在应用层这样做是合理的。但是,如果您有一个支持窗口函数的数据库,那么您可以更轻松地做一个仅数据库的解决方案。
我无法抗拒。这里有一些代码将使用一个表来存储订单。您需要循环通过,每个孔一次:
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