【发布时间】:2021-02-01 07:26:54
【问题描述】:
对于相关的表和列(比以下更多),我有一个customer 表,其中包含cust_id 和state
列和一个account 表,其中包含account_id、cust_id 和avail_balance 列。
示例customer 表:
| cust_id | state |
|--------:|-------|
| 1 | MA |
| 2 | MA |
| 3 | MA |
| 4 | MA |
| 5 | NH |
| 6 | MA |
| 7 | MA |
| 8 | NH |
| 9 | MA |
| 10 | NH |
| 11 | MA |
| 12 | NH |
| 13 | MA |
示例account 表:
| account_id | cust_id | avail_balance |
|-----------:|--------:|--------------:|
| 1 | 1 | 1057.75 |
| 2 | 1 | 500 |
| 3 | 1 | 3000 |
| 4 | 2 | 2258.02 |
| 5 | 2 | 200 |
| 7 | 3 | 1057.75 |
| 8 | 3 | 2212.5 |
| 10 | 4 | 534.12 |
| 11 | 4 | 767.77 |
| 12 | 4 | 5487.09 |
| 13 | 5 | 2237.97 |
| 14 | 6 | 122.37 |
| 15 | 6 | 10000 |
| 17 | 7 | 5000 |
| 18 | 8 | 3487.19 |
| 19 | 8 | 387.99 |
| 21 | 9 | 125.67 |
| 22 | 9 | 9345.55 |
| 23 | 9 | 1500 |
| 24 | 10 | 23575.12 |
| 25 | 10 | 0 |
| 27 | 11 | 9345.55 |
| 28 | 12 | 38552.05 |
| 29 | 13 | 50000 |
这是我希望优化的查询示例。
SELECT account.cust_id
FROM account, customer
WHERE
account.cust_id = customer.cust_id
AND customer.state = 'MA'
AND customer.cust_id >
(SELECT MAX(customer.cust_id) AS max_nh_cust_id
FROM account, customer
WHERE
account.cust_id = customer.cust_id
AND state = 'NH')
AND account.avail_balance >
(SELECT MAX(avail_balance) AS max_nh_avail_balance
FROM account, customer
WHERE
account.cust_id = customer.cust_id
AND state = 'NH');
上述示例数据的预期结果(如果数据不同,可能不仅仅是 1 个结果):
| cust_id |
|--------:|
| 13 |
上面的问题是代码冗余以及我们如何使用两个子查询多次遍历account 表。我希望可以使用一个子查询从account 表中获取最大值cust_id 和avail_balance,并在外部查询中使用这两个标量。例如,查询的形状可能如下所示:
SELECT account.cust_id
FROM account, customer
WHERE
account.cust_id = customer.cust_id
AND (customer.cust_id > max_nh_cust_id AND account.avail_balance) > max_nh_avail_balance) IN
(SELECT MAX(customer.cust_id) AS max_nh_cust_id, MAX(avail_balance) AS max_nh_avail_balance
FROM account, customer
WHERE
account.cust_id = customer.cust_id
AND state = 'NH');
显然,上述方法不起作用。实现上述代码冗余较少且仅在一个查询中(可能包含子查询)的最有效方法是什么?
【问题讨论】:
-
请以表格文本形式提供示例数据和所需结果。目前还不清楚您要在这里做什么。
-
@GMB 我添加了样本数据和样本结果
-
@RickJames 会的。谢谢你的建议!
标签: mysql select subquery query-optimization aggregate-functions