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