sql-是否可以使用另一个SELECT查询来筛选SELECT查询的结果?

时间:2019-03-03 01:23:36

标签: mysql sql sorting mariadb ranking

具体来说,我想做的是按列值(在此称为power)对表进行排名,然后使用该排名表并找到特定的行(在这种情况下为用户)。就像在视频游戏排行榜中查找特定用户的排名一样。

基本上,我想在已排序的表中查找特定行。我知道怎么做,但不能一起做。

我想我想做的就是结合以下这些语句:

排序:

SELECT * FROM users ORDER BY power DESC;

过滤:

SELECT * FROM otherQueryResult WHERE discordID = discordIDInput;

然后找出返回的行的行号。

实际上,我想要一个看起来像这样的结果:

+-----------+------+
| discordID | rank |
+-----------+------+
| 123456789 |  52  |
+-----------+------+

14岁时,我的SQL知识仍然非常有限-因此,与目前的原始性能或可用性相比,我更喜欢更简单的解决方案,但是可以提供任何帮助。

在此先感谢您的帮助。

3 个答案:

答案 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)上使用索引,这应该具有非常好的性能。