有条款

时间:2015-06-18 17:33:56

标签: mysql having

我的桌子,借款人:

+----------+---------+
| name     | loan_id |
+----------+---------+
| Adams    | L16     |
| Curry    | L93     |
| Hayes    | L15     |
| Jackson  | L14     |
| Jones    | L17     |
| Smith    | L11     |
| Smith    | L23     |
| Williams | L17     |
+----------+---------+

贷款:

+---------+-------------+--------+
| loan_id | branch_name | amount |
+---------+-------------+--------+
| L11     | Round Hill  |    900 |
| L14     | Downtown    |   1500 |
| L15     | Perryridge  |   1500 |
| L16     | Perryridge  |   1300 |
| L17     | Downtown    |   1000 |
| L23     | Redwood     |   2000 |
| L93     | Mianus      |    500 |
+---------+-------------+--------+

我希望找到客户最大的贷款。

我在查询中取得了部分成功:

select name, max(amount) 
from loan, borrower 
where borrower.loan_id=loan.loan_id;

结果:

+-------+-------------+
| name  | max(amount) |
+-------+-------------+
| Adams |        2000 |
+-------+-------------+

但它从第一行取名,找到最大数量并打印结果。所以我使用having这样的句子:

select name, amount
from loan, borrower 
where borrower.loan_id=loan.loan_id 
having max(amount)=amount;

但我得到一个空集。

2 个答案:

答案 0 :(得分:1)

您可以group by客户并从加入的max表中获取loan金额。

此查询与您的第一次尝试非常相似,但区别在于group by子句。这会导致查询每个客户名称返回一行(名称在group by中)。 max(以及我的示例中也为sum)是按“组”计算的,因此在这种情况下按名称计算。

在您的查询中,您没有group by,因此max已确定(聚合)所有行。许多其他数据库甚至不会执行您的查询,因为他们认为应该在group by中指定字段,或者应该在minmax或{等聚合函数中调用该字段。 {1}}。 MySQL有点不同,因为它只选择要显示的任何客户名称。

sum

当然,如果客户也有ID,那会更好。毕竟,你可能会得到两个名叫史密斯的客户。

答案 1 :(得分:1)

如果你想要的是获得最高金额的贷款和拥有它的客户,那么你可以使用以下查询:

SELECT b.name, l.loan_id, l.amount 
FROM borrower AS b
INNER JOIN loan AS l ON b.loan_id = l.loan_id
ORDER BY l.amount DESC
LIMIT 1

查询创建一组所有贷款及其关联客户,按amount按降序排列,并返回最上面的记录,即具有最大金额的记录。

如果多个贷款具有相同的最高金额,并且您希望返回这些贷款的所有的数据,那么您可以使用以下查询:

SELECT b.name, l.loan_id, l.amount 
FROM borrower AS b
INNER JOIN loan AS l ON b.loan_id = l.loan_id
WHERE l.amount IN (SELECT MAX(amount)
                   FROM loan )

Demo here