我有一个问题,排名球员在我的数据库(至少在某种程度上是好的表现)。
我只有一张桌子,所有的球员都放在那里。玩家的等级取决于
RankingPoints
. 所以(在最简单的情况下)玩家的等级是这个表中的位置
RankingPoints DESC
可能不止一个玩家拥有相同的
. 所以我需要一个平局破发点,这样20万分的球员排名就不会改变了。
另一方面,我有一些根据球员的性别,年龄和国籍的分级别。
我怎么能现场看排名,比如我有一个男性球员,来自德国的u18,我想知道他的国家排名。
目前我有这个U18CountryRank的子查询
U18CountryRank = Players // the database-table holding all players
.Where(p => p.Gender == MainPlayer.Gender) // male
.Where(p => p.Country == MainPlayer.Country) // Germany
.Where(p => p.Classification == MainPlayer.Classification) // U18
.Where(p => p.RankingPoints >= MainPlayerRankingPoints) // players better or equal than me
.Where(p => SqlFunctions.Difference(p.PlayerId.ToString(), MainPlayer.PlayerId.ToString()) >= 0) // order by PlayerId
.Count(); // take the number
SELECT
1 AS [C1],
[Project1].[C1] AS [C2]
FROM ( SELECT
(SELECT
COUNT(1) AS [A1]
FROM [dbo].[Players] AS [Extent2]
WHERE ([Extent2].[RankingPoints] >= [Extent1].[RankingPoints]) AND ([Extent2].[Gender] = [Extent1].[Gender]) AND ([Extent2].[Country] = [Extent1].[Country]) AND ((DIFFERENCE(LOWER( CAST( [Extent2].[PlayerId] AS nvarchar(max))), LOWER( CAST( [Extent1].[PlayerId] AS nvarchar(max))))) >= 0)) AS [C1]
FROM [dbo].[Players] AS [Extent1]
WHERE (cast('b8957470-db27-4b3c-aa5d-3035ca2c86e6' as uniqueidentifier) = [Extent1].[PlayerId])
) AS [Project1]
这对一个玩家来说很好。但当我需要选择某个国家的所有球员时,我的表现会很糟糕。
我已经试过用
View
它只选择
PlayerId
另一种方法是在有序子集上使用行数(但在较大的集上仍然是相同的问题)。
对于这种问题,什么是“最佳实践”?