C# 排行榜,排名查询,如何返回用户排名上/下的行
在这个查询中,如果我想提取我知道有$name和$score的特定个人的排名,并返回该排名上/下的行,比如+/-4,我该怎么做C# 排行榜,排名查询,如何返回用户排名上/下的行,c#,php,sql,unity3d,C#,Php,Sql,Unity3d,在这个查询中,如果我想提取我知道有$name和$score的特定个人的排名,并返回该排名上/下的行,比如+/-4,我该怎么做 $query = "SELECT @curRank := @curRank + 1 AS Rank, uniqueID, name, score FROM scores, (SELECT @curRank := 0) r ORDER by score DESC"; 我
$query = "SELECT @curRank := @curRank + 1 AS Rank,
uniqueID,
name,
score
FROM scores, (SELECT @curRank := 0) r
ORDER by score DESC";
我用php编写代码,在Unity中使用MySQL和C。我的游戏是调用服务器并运行php代码。目标是在游戏中回显信息并解析信息
非常感谢您的帮助:基于您的:=,我假设您正在使用PostgreSQL,对吗?我更熟悉T-SQL语法;但无论如何,PostgreSQL和T-SQL都有窗口功能。您可以实现以下类似的功能,我省略了一些变量供您填写:
$query = "WITH scoreOrder
AS
(
SELECT uniqueID,
name,
score,
ROW_NUMBER() OVER (ORDER BY score DESC, uniqueID DESC) AS RowNum
FROM scores
ORDER BY uniqueID DESC
)
SELECT ns.*
FROM scoreOrder ms --Your matching score
INNER JOIN scoreOrder ns --Your nearby scores
ON ms.name = /* your name variable */
AND ms.score = /* your score variable */
AND ns.RowNum BETWEEN ms.RowNum - /* your offset */ and ms.RowNum + /* your offset */";
说明:首先,我们创建一个名为scoreOrder的公共表表达式,并为您的分数投影一个RowNum列。简言之,按分数排序的行数DESC,uniqueID DESC只是说,我返回按分数和uniqueID排序的记录的行号,降序和降序。然后,你自己加入CTE。。。ms将是您匹配的分数,您将与ns合并,其中ns.RowNum将位于ms.RowNum之间,加上或减去偏移量
还有很多其他窗口功能。以下是一些或多或少适合您的场景的其他方法:
ROW_NUMBER—记录的行号
等级-记录的等级,在关系中重复,包括
差距,即,如果排名第二,你会有第一,第二,第二,
第四
密集等级-与等级相同,只是它填补了空白
i、 例如,如果排名第二,你会有第一,第二,第二,第三
有关更多信息,请查看及其上的PostgreSQL文档
更新:
不幸的是,MySQL不支持窗口函数或公共表表达式。在您的场景中,您必须将上一个查询的结果放入临时表中,然后执行类似的连接,如上文所示。比如说
CREATE TEMPORARY TABLE IF NOT EXISTS allRankings AS
(
SELECT @curRank := @curRank + 1 AS Rank,
uniqueID,
name,
score
FROM scores, (SELECT @curRank := 0) r
ORDER by score DESC, uniqueID
);
SELECT r.*
FROM allRankings r
INNER JOIN allRankings myRank
ON r.Rank BETWEEN myRank.Rank - <your offset> AND myRank.Rank + <your offset>
AND myRank.name = <your name>
AND myRank.score = <your score>
ORDER by r.Rank;
我没有在SQLFiddle上使用临时表,因为您必须在“构建架构”窗口中构建表。您有什么问题?您卡在哪里?此查询是否在存储过程中?为什么要在SQL SELECT中为变量赋值?@Programmer:我一直在创建一个查询,以便在为数据库中的每个人分配了一个秩之后提取用户的秩。然后在该级别上/下拖动行。@Sloarcher:我分配一个变量curRank,因为我想使用curRank返回刚播放的用户级别上/下的用户。你是对的-MySQL不支持CTE或窗口功能。我已经更新了答案,添加了一个带有SQLFIDLE的MySQL示例link@Yearger-你的最后一个答案绝对精彩,我正在尝试实施一个边缘案例,玩家要么排名前5,要么排名后5。例如,如果我的偏移量为4,则如果我排名第一,当前实现将仅显示下面的4。我想在下面显示9。同样,如果我排名第二,我希望它显示1以上和8以下。思想?