Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL:获取数据库中的玩家排名_C#_Sql_.net_Sql Server - Fatal编程技术网

C# SQL:获取数据库中的玩家排名

C# SQL:获取数据库中的玩家排名,c#,sql,.net,sql-server,C#,Sql,.net,Sql Server,我正在为我正在构建的游戏建立一个高分体系。我认为,或者说希望这是一个容易回答的问题。我需要让玩家和其他玩家进行排名。假设有3名球员,你的分数最低。所以你的排名是3。我如何在SQL中得到它?我想我使用COUNT,但我不确定它将如何遍历每一行来找到我的球员的分数。我知道我会在下订单之前 这是我的基本表格: SELECT [ID] ,[Email] ,[High_Score] ,[Board_Name] ,[Difficulty] ,[Player_Time] FROM [Rune

我正在为我正在构建的游戏建立一个高分体系。我认为,或者说希望这是一个容易回答的问题。我需要让玩家和其他玩家进行排名。假设有3名球员,你的分数最低。所以你的排名是3。我如何在SQL中得到它?我想我使用COUNT,但我不确定它将如何遍历每一行来找到我的球员的分数。我知道我会在下订单之前

这是我的基本表格:

SELECT [ID]
  ,[Email]
  ,[High_Score]
  ,[Board_Name]
  ,[Difficulty]
  ,[Player_Time]
FROM [Rune_Master].[dbo].[High_Scores]
我需要根据棋盘名称、难度进行筛选,因为每个棋盘有3个难度,玩家可以在每个棋盘上排名3种不同的方式。最终,尽管这是基于他们与其他人相比的高分。每个棋盘的每个难度每个玩家只有1分。因此,分数将根据棋盘+难度来确定。我希望这一切都有意义

这就是我到目前为止所做的:

--Player Data
DECLARE @PlayerScore AS BIGINT
DECLARE @PlayerRank AS NVARCHAR(100)

IF EXISTS(SELECT [High_Score] FROM [dbo].[High_Scores] WHERE [Board_Name] = @Board AND [Difficulty] = @Difficulty AND [Email] = @Email) BEGIN
    SET @PlayerScore = (SELECT [High_Score] FROM [dbo].[High_Scores] WHERE [Board_Name] = @Board AND [Difficulty] = @Difficulty AND [Email] = @Email)
    SET @PlayerRank = (SELECT TOP 1 COUNT([High_Score]) FROM [dbo].[High_Scores] WHERE [Board_Name] = @Board AND [Difficulty] = @Difficulty ORDER BY [High_Score] DESC)
END ELSE BEGIN
    SET @PlayerScore = 0;
    SET @PlayerRank = 'UnRanked';
END

--Top 5 Player Scores
SELECT DISTINCT TOP 5
    [High_Score] AS [Score],
    [Player_Time],
    [Board_Name],
    [Email],
    @PlayerScore AS 'Player_Score',
    @PlayerRank AS 'Player_Rank'
FROM
    [dbo].[High_Scores]
WHERE
    [Board_Name] = @Board AND
    [Difficulty] = @Difficulty
ORDER BY [High_Score] DESC, [Player_Time] DESC, [Email]

如果有人需要,这里有答案。谢谢大家的帮助

代码:

为了解释我做了什么:

声明了我的变量 创建了一个临时表,我将使用它来构建排名表临时表 用添加行计数器的数据填充我的秩表 通过那里的电子邮件从我的排名表中选择我的用户的排名,所以我只返回他们的排名。
如果Microsoft SQL Server将相关数据库实现添加为标记!:分区上的行数[或密集列]。。[ORDER BY..]。它的MSSQL Express服务器,但我不确定是否理解。按OK查找分区,将其添加到临时表中,然后从临时表中选择值以获得人员排名?为什么需要临时表?所有这些都可以在一个查询中完成。对填充临时表的select语句使用CTE,然后在选择最终结果集时使用该CTE。不要无缘无故地养成应用这种模式的习惯。还有一件事——使用DISTINCT应该是非常罕见的。如果你认为你需要它,很可能是你在掩盖一个逻辑缺陷或一个设计拙劣的模式。欢迎分享你的答案。这一点暂时有效,但我想看看你的建议,以便更好地理解。
    DECLARE
    @Board AS NVARCHAR(100) = 'Templo_Mayor',
    @Difficulty AS INT = 0,
    @Email AS NVARCHAR(500) = 'Computer',
    @PlayerRank AS NVARCHAR(100)


CREATE TABLE #Rank
(
    High_Score BIGINT,
    Row# BIGINT,
    EMAIL NVARCHAR(500)    
 )
INSERT INTO #Rank (High_Score, Row#, EMAIL) 
SELECT [High_Score], ROW_NUMBER() OVER(ORDER BY [High_Score] DESC) AS Row#, [EMAIL] FROM [dbo].[High_Scores] WHERE [Board_Name] = @Board AND [Difficulty] = @Difficulty ORDER BY [High_Score] DESC

SELECT Row# FROM #Rank WHERE EMAIL = @Email ORDER BY [High_Score] DESC
DROP TABLE #Rank