sql - 有没有办法过滤SELECT查询的结果,使用另一个SELECT查询?

问题描述 投票:1回答:3

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

基本上,我想在已经订购的表中找到特定的行。我知道如何做到这两点,但不是在一起。

我想我想要做的是结合这些陈述:

排序:

SELECT * FROM users ORDER BY power DESC;

过滤:

SELECT * FROM otherQueryResult WHERE discordID = discordIDInput;

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

实际上,我希望得到一个看起来像这样的结果:

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

14岁时,我的SQL知识仍然非常有限 - 所以我更喜欢简单的解决方案而不是原始性能或可用性,但是任何帮助都是值得赞赏的。

在此先感谢您的帮助。

mysql sql sorting mariadb ranking
3个回答
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()相同,但不会在排名中产生差距

2
投票

加入表格然后排名。 select discordid, RANK() OVER
(PARTITION BY u.userid ORDER BY (the column that you are ranking from) DESC) AS Rank from otherqueryresult as q inner join user as u on u.id=q.userid


0
投票

您可以直接进行计算。

我想你想要:

select 1 + count(*)
from users u
where u.power > (select u2.power from users u2 where u2.discordID = ?);

实际上,您并不需要窗口功能。对于(discordId, power)(power)的索引,这应该具有非常好的性能。

© www.soinside.com 2019 - 2024. All rights reserved.