【问题标题】:sql - Is there a way to filter through the results of a SELECT query, with another SELECT query?sql - 有没有办法通过另一个 SELECT 查询过滤 SELECT 查询的结果?
【发布时间】:2019-03-03 01:23:36
【问题描述】:

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

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

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

排序:

SELECT * FROM users ORDER BY power DESC;

过滤:

SELECT * FROM otherQueryResult WHERE discordID = discordIDInput;

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

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

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

14 岁时,我的 SQL 知识仍然非常有限 - 因此,目前我更喜欢更简单的解决方案,而不是原始性能或可用性,但我们不胜感激。

提前感谢您的帮助。

【问题讨论】:

  • 你能给列名吗,因为为了实现你的目标,你必须做一个连接

标签: mysql sql mariadb sql-order-by where-clause


【解决方案1】:

您似乎正在寻找诸如RANK()之类的窗口函数:

SELECT * 
FROM (SELECT u.*, RANK() OVER(ORDER BY power DESC) rnk FROM users u) x 
WHERE discordID = ?

内部查询为每个用户分配一个排名,power 最高的用户排名第一。然后,外部查询过滤具有相关discordID 的用户。

还有其他窗口函数可以响应您的用例:

  • ROW_NUMBER():为每条记录分配一个排名;偶数记录的处理方式不一致

  • RANK(): even-records 获得相同的排名;如果两个用户排名为 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

    【讨论】:

      【解决方案3】:

      您可以直接进行计算。

      我想你想要:

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

      您实际上并不需要为此目的的窗口函数。使用(discordId, power)(power) 上的索引,这应该具有非常非常好的性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-20
        • 2013-01-09
        • 2022-11-24
        • 2018-06-08
        • 1970-01-01
        • 2020-09-16
        • 2019-01-08
        • 1970-01-01
        相关资源
        最近更新 更多