sql - 有没有办法过滤SELECT查询的结果,使用另一个SELECT查询?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql - 有没有办法过滤SELECT查询的结果,使用另一个SELECT查询?相关的知识,希望对你有一定的参考价值。
具体来说,我想要做的是按列值对表进行排名,在此称为power
,然后获取该排名表并找到特定行,或者在这种情况下是用户。就像在视频游戏排行榜中查找特定用户的排名一样。
基本上,我想在已经订购的表中找到特定的行。我知道如何做到这两点,但不是在一起。
我想我想要做的是结合这些陈述:
排序:
SELECT * FROM users ORDER BY power DESC;
过滤:
SELECT * FROM otherQueryResult WHERE discordID = discordIDInput;
然后找出返回的行的行号。
实际上,我希望得到一个看起来像这样的结果:
+-----------+------+
| discordID | rank |
+-----------+------+
| 123456789 | 52 |
+-----------+------+
14岁时,我的SQL知识仍然非常有限 - 所以我更喜欢简单的解决方案而不是原始性能或可用性,但是任何帮助都是值得赞赏的。
在此先感谢您的帮助。
你好像在寻找像RANK()
这样的窗函数:
SELECT *
FROM (SELECT u.*, RANK() OVER(ORDER BY power DESC) rnk FROM users u) x
WHERE discordID = ?
内部查询为每个用户分配排名,其中具有最高power
的用户排名第一。然后,外部查询过滤具有相关discordID
的用户。
还有其他窗口函数可以响应您的用例:
ROW_NUMBER()
:为每条记录分配一个等级;偶数记录不一致RANK()
:偶数记录获得相同的排名;如果两个用户的排名为1,则以下用户的排名为3DENSE_RANK()
:与RANK()
相同,但不会在排名中产生差距
加入表格然后排名。 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
您可以直接进行计算。
我想你想要:
select 1 + count(*)
from users u
where u.power > (select u2.power from users u2 where u2.discordID = ?);
实际上,您并不需要窗口功能。对于(discordId, power)
和(power)
的索引,这应该具有非常好的性能。
以上是关于sql - 有没有办法过滤SELECT查询的结果,使用另一个SELECT查询?的主要内容,如果未能解决你的问题,请参考以下文章
查询SQL,写一个查询SQL用来过滤表中数据,类似select ... from?