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,则以下用户的排名为3
  • DENSE_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查询?的主要内容,如果未能解决你的问题,请参考以下文章

Select2 Ajax 不根据查询过滤结果

sql查询语句并不是最先执行SELECT

查询SQL,写一个查询SQL用来过滤表中数据,类似select ... from?

sql优化

有没有办法删除这种类型的 SQL SELECT 中的嵌套查询?

按日期过滤 SQL 结果