鉴于此查询,如果我想拉出我知道 $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
将是您匹配的分数,然后您将 that 与 ns
结合在一起,其中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/