有人可以帮我弄清楚我的查询是不是有误吗?
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
【讨论】:
以上是关于有人可以帮我弄清楚我的查询是不是有误吗?的主要内容,如果未能解决你的问题,请参考以下文章
Rails Activerecord 关系:使用子查询作为 SQL 选择语句的表