c# - 排行榜,排名查询,如何返回高于/低于用户排名的行

标签 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 代码。目标是回显信息并在游戏中解析信息。

任何帮助将不胜感激:)

最佳答案

根据您的 :=,我假设您使用的是 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) 只是在说,“我正在返回这条记录的行号排序方式 score uniqueID,均按降序排列。”然后,您将 CTE 与自身结合起来……ms 将是您匹配的分数,然后您将 thatns 结合在一起,其中ns.RowNum 将在您的 ms.RowNum 加上或减去您的偏移量之间。

还有大量其他窗口函数。 以下是一些可能或多或少适合您的场景的其他内容:

  • ROW_NUMBER() - 记录的行号
  • RANK() - 记录的排名,重复并包含 差距(即,如果第 2 名并列,您将获得 第 1、第 2、第 2、 4th)
  • DENSE_RANK() - 与排名相同,只是它填补了空白 (即,如果第二名并列,您将获得第一、第二、第二、第三名)

有关更多信息,请查看 windowing functions 上的 PostgreSQL 文档和他们的 tutorial

更新:

不幸的是,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;

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

关于c# - 排行榜,排名查询,如何返回高于/低于用户排名的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43419641/

相关文章:

c# - 为什么会有 JConstructor?

c# - 无法打开 mysql 连接

java - 通过使用 schema 和表名使用 jooq 生成 DDL

sql - 将整个sql脚本插入变量中

c# - 从OLE二进制字符串解析MathType MTEF数据

c# - 自托管 SignalR 服务将无法工作(开始)

Javascript 拆分并加入 PHP

php - 根据php中的用户输入生成报告

php - 单击按钮时从表中获取值

sql - 我试图在 ADO Excel 中使用的这个 UPDATE 语句有什么问题?