有人可以帮我弄清楚我的查询是不是有误吗?

Posted

技术标签:

【中文标题】有人可以帮我弄清楚我的查询是不是有误吗?【英文标题】:Can someone help me figure out if I'm making a mistake in my query?有人可以帮我弄清楚我的查询是否有误吗? 【发布时间】:2020-09-21 20:25:58 【问题描述】:

我正在尝试创建一个查询,以返回我的数据库中所有的人的姓名,这些人的钱不到最富有的人的一半。 这是我的查询:

  select P1.name 
    from Persons P1 left join 
         AccountOf A1 on A1.person_id = P1.id left join 
         BankAccounts B1 on B1.id = A1.account_id
group by name
  having SUM(B1.balance) < MAX((select SUM(B1.balance) as b
                                  from AccountOf A1 left join 
                                       BankAccounts B1 on B1.id = A1.account_id
                              group by A1.person_id 
                              order by b desc 
                                 LIMIT 1)) * 0.5

这是结果:

+-------+
| name  |
+-------+
| Evert |
+-------+

我在数据库中有以下表格:

+---------+--------+--+
| Persons |        |  |
+---------+--------+--+
| id      | name   |  |
| 11      | Evert  |  |
| 12      | Xavi   |  |
| 13      | Ludwig |  |
| 14      | Ziggy  |  |
+---------+--------+--+
+--------------+---------+
| BankAccounts |         |
+--------------+---------+
| id           | balance |
| 11           | 525000  |
| 12           | 750000  |
| 13           | 1900000 |
| 14           | 1600000 |
+--------------+---------+
+-----------+-----------+------------+
| AccountOf |           |            |
+-----------+-----------+------------+
| id        | person_id | account_id |
| 301       | 11        | 12         |
| 302       | 13        | 12         |
| 303       | 13        | 14         |
| 304       | 14        | 11         |
| 305       | 14        | 13         |
+-----------+-----------+------------+

我在这里缺少什么?我应该在结果中得到两个条目(Evert,Xavi)

【问题讨论】:

【参考方案1】:

我不会以这种方式处理逻辑(我会使用窗口函数)。但是你最终的having 有两个聚合级别。那应该行不通。你想要:

having SUM(B1.balance) < (select 0.5 * SUM(B1.balance) as b
                          from AccountOf A1 join
                               BankAccounts B1 on B1.id = A1.account_id
                          group by A1.person_id
                          order by b desc 
                          limit 1
                         )

我还将0.5 移动到子查询中,并将left join 更改为join——这些表需要匹配才能获得余额。

【讨论】:

【参考方案2】:

如果您的 - 未公开,我会推荐窗口函数! - 数据库支持它们。

您可以只加入和聚合一次,然后使用窗口max() 获得最高余额。然后剩下的就是在外部查询中过滤:

select *
fom (
    select p.id, p.name, coalesce(sum(balance), 0) balance,
        max(sum(balance)) over() max_balance 
    from persons p
    left join accountof ao on ao.person_id = p.id
    left join bankaccounts ba on ba.id = ao.account_id
    group by p.id, p.name
) t
where balance > max_balance * 0.5

【讨论】:

以上是关于有人可以帮我弄清楚我的查询是不是有误吗?的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释如何确定我的父文件以解除状态吗?

如果 firebase 文档不存在则抛出错误

Rails Activerecord 关系:使用子查询作为 SQL 选择语句的表

Codeigniter分页链接转到404 Page Not Found

使用归并排序计算反转次数[关闭]

更新视图查询时是不是可以执行触发器