我正在使用 Unity 制作一个基于排名的游戏。但是我陷入了最佳匹配的查询中,请帮助我。
SQL 查询:
SELECT name, high_score, @rn:=@rn+1 as row_num
FROM score, (select @rn:=0) as r
ORDER BY high_score DESC
SQL 表:
row_number |得分 |名------------------------------- 1 | 210 |法案 2 | 431 |莱纳斯 3 | 352 |拉斯穆斯 4 | 173 |史蒂夫 5 | 294 |罗斯 6 | 411 |亨利 7 | 313 |贾格纳特 8 | 115 |萨米特 9 | 217 |维沙尔 10 | 419 |塔努吉 11 | 321 |哈沙德 12 | 123 |帕拉格 13 | 225 |安缦 14 | 427 |阿马尔 15 | 329 |马杜尔 16 | 131 |萨钦
我想要如下结果:
对于名称"罗斯",即在高分和低分之间的第 7 位。
注意:数据库有数千个用户,但结果必须为 15。
https://i.stack.imgur.com/CroRd.png
请考虑以下事项。请注意,在此示例中,我使用了 11 而不是 15(只是因为针对示例数据集进行测试更容易)。此外,我的核心算法比你慢,而且它不考虑关系 - 所以你可能想把它换成像你这样的东西,它更快,而且确实如此!
DROP TABLE IF EXISTS score;
CREATE TABLE score
(score INT NOT NULL,firstname VARCHAR(20) NOT NULL PRIMARY KEY);
INSERT INTO score VALUES
(210 ,'Bill'),
(431 ,'Linus'),
(352 ,'Rasmus'),
(173 ,'Steve'),
(294 ,'Ross'),
(411 ,'Henry'),
(313 ,'Jagannath'),
(115 ,'Samit'),
(217 ,'Vishal'),
(419 ,'Tanuj'),
(321 ,'Harshad'),
(123 ,'Parag'),
(225 ,'Aman'),
(427 ,'Amar'),
(329 ,'Madhur'),
(131 ,'Sachin');
SELECT score,firstname,rank
FROM
( SELECT b.*
FROM
( SELECT x.*
, COUNT(*) rank
FROM score x
JOIN score y
ON y.score >= x.score
GROUP
BY firstname,score
) a
JOIN
( SELECT x.*
, COUNT(*) rank
FROM score x
JOIN score y
ON y.score >= x.score
GROUP
BY firstname,score
) b
WHERE a.firstname = 'Ross'
AND ABS(b.rank-a.rank) <=15
ORDER
BY ABS(b.rank-a.rank) LIMIT 11
) n
ORDER
BY rank;
+-------+-----------+------+
| score | firstname | rank |
+-------+-----------+------+
| 411 | Henry | 4 |
| 352 | Rasmus | 5 |
| 329 | Madhur | 6 |
| 321 | Harshad | 7 |
| 313 | Jagannath | 8 |
| 294 | Ross | 9 |
| 225 | Aman | 10 |
| 217 | Vishal | 11 |
| 210 | Bill | 12 |
| 173 | Steve | 13 |
| 131 | Sachin | 14 |
+-------+-----------+------+