鉴于此查询,如果我想拉出特定个体的排名,我知道那里有$ 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代码。目标是回应信息并在游戏中解析信息。
非常感谢任何帮助:)
答案 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)
只是说,"我正在返回 score
和uniqueID
订购的此记录的行号,那个顺序。"然后,您自己加入CTE ... ms
将是您匹配的分数,并且 加入ns
ns.RowNum
将ms.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窗口中构建表)。