C# 排行榜,排名查询,如何返回用户排名上/下的行

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"; 我

在这个查询中,如果我想提取我知道有$name和$score的特定个人的排名,并返回该排名上/下的行,比如+/-4,我该怎么做

$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以下。思想?