具体来说,我想做的是按列值(在此称为power
)对表进行排名,然后使用该排名表并找到特定的行(在这种情况下为用户)。就像在视频游戏排行榜中查找特定用户的排名一样。
基本上,我想在已排序的表中查找特定行。我知道怎么做,但不能一起做。
我想我想做的就是结合以下这些语句:
排序:
SELECT * FROM users ORDER BY power DESC;
过滤:
SELECT * FROM otherQueryResult WHERE discordID = discordIDInput;
然后找出返回的行的行号。
实际上,我想要一个看起来像这样的结果:
+-----------+------+
| discordID | rank |
+-----------+------+
| 123456789 | 52 |
+-----------+------+
14岁时,我的SQL知识仍然非常有限-因此,与目前的原始性能或可用性相比,我更喜欢更简单的解决方案,但是可以提供任何帮助。
在此先感谢您的帮助。
答案 0 :(得分:3)
您似乎正在寻找诸如RANK()
之类的窗口函数:
SELECT *
FROM (SELECT u.*, RANK() OVER(ORDER BY power DESC) rnk FROM users u) x
WHERE discordID = ?
内部查询为每个用户分配一个排名,其中排名最高的power
的用户排名第一。然后,外部查询过滤具有相关discordID
的用户。
还有其他窗口功能可以响应您的用例:
ROW_NUMBER()
:为每个记录分配一个等级;偶数记录的处理方式不一致
RANK()
:偶数记录的排名相同;如果两个用户的排名为1,则以下用户的排名为3
DENSE_RANK()
:与RANK()
相同,但不会在排名中造成差距
答案 1 :(得分:2)
加入表格,然后排名。
git rebase -i 8894377
答案 2 :(得分:0)
您可以直接进行计算。
我想你想要
select 1 + count(*)
from users u
where u.power > (select u2.power from users u2 where u2.discordID = ?);
您实际上不需要此功能的窗口功能。在(discordId, power)
和(power)
上使用索引,这应该具有非常好的性能。