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

时间:2017-04-14 21:44:30

标签: 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";

我在php中编码,在Unity中使用MySQL和C#。我的游戏正在调用服务器并运行php代码。目标是回应信息并在游戏中解析信息。

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:2)

基于您的:=,我假设您正在使用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列。简而言之,ROW_NUMBER() OVER (ORDER BY score DESC, uniqueID DESC)只是说,"我正在返回 scoreuniqueID订购的此记录的行号,那个顺序。"然后,您自己加入CTE ... ms将是您匹配的分数,并且 加入ns ns.RowNumms.RowNum介于ROW_NUMBER()之间,加上或减去你的偏差。

还有很多其他窗口功能。 以下是其他一些可能或多或少适合您的方案的内容:

  • RANK() - 记录的rownumber
  • DENSE_RANK() - 记录的排名,重复关系和包含 差距(即,如果第二个位置,你会有第1,第2,第2, 第四
  • 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; - 与排名相同,只是它填补了空白 (即,如果第二名并列第二名,那么第一名,第二名,第二名,第三名

有关详细信息,请查看windowing functions上的PostgreSQL文档及其tutorial

更新

不幸的是,MySQL不支持窗口函数或公用表表达式。在您的方案中,您必须将先前查询的结果放入临时表中,然后执行类似的连接,如上所示。例如......

{{1}}

Here is a SQLFiddle link for an example.(我没有在SQLFiddle上使用临时表,因为你必须在Build Schema窗口中构建表)。