【问题标题】:MySql Where condition after for after selecting the ranked query选择排名查询后的 MySql Where 条件
【发布时间】:2019-10-02 05:18:34
【问题描述】:

数据库:

  • 用户 - id、名称
  • 消息 - 发件人、详细信息、收件人
SELECT 
    id, COUNT(sender) AS COUNT, 
    RANK() OVER (ORDER BY COUNT(sender) DESC) count_rank  
FROM 
    `message` 
LEFT JOIN 
    `user` ON id = sender  
GROUP BY 
    sender 
ORDER BY 
    COUNT(sender) DESC;
+----+-------+-----------+
| id | count | count_rank|
+----+-------+-----------+
| 7  | 20    |         1 |
| 4  | 18    |         2 |
| 9  | 18    |         2 |
| 2  |  7    |         4 |
| 5  |  4    |         5 |
+----+-------+-----------+

在这个输出上,我只想得到 ID 9 的计数和排名

我试试

SELECT 
    id, COUNT(sender) AS COUNT, 
    RANK() OVER (ORDER BY COUNT(sender) DESC) count_rank  
FROM 
    `message` 
LEFT JOIN 
    `user` ON id = sender 
WHERE 
    `message`.`sender` = 9
 GROUP BY 
     sender 
 ORDER BY 
     COUNT(sender) DESC;

但是我的排名是错误的

我的结果:Id 9 rank 1

预期:Id 9 rank 2

【问题讨论】:

  • 如果您已经使用 id=9 过滤了结果,您将不会产生与 rank() 相同的结果。您只需要一个subquery。见 Tim Biegeleisen 的回答,你也可以使用select * from ([your original query]) t1, where t1.id = 9

标签: mysql sql where-clause rank


【解决方案1】:

您需要对当前查询进行子查询,然后限制为您想要的 id

WITH cte AS (
    SELECT u.id, m.sender, COUNT(*) AS count,
        RANK() OVER (ORDER BY COUNT(*) DESC) count_rank
    FROM message m
    LEFT JOIN user u
        ON u.id = m.sender
    GROUP BY u.id, m.sender
)

SELECT *
FROM cte
WHERE id = 9;

这是必要的原因是,如果您在计算排名的查询中限制为id = 9,那么只有具有id = 9 的记录才会被排名。但是,您希望对所有条记录进行排名,然后进行过滤。

【讨论】:

    猜你喜欢
    • 2021-10-26
    • 2016-01-23
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    相关资源
    最近更新 更多