【发布时间】:2015-06-17 09:44:51
【问题描述】:
我有以下表结构。
loan和loan_repayment的关系是一对多的
贷款
---------------------------------------------------------------------------------------
id | loan_amount | loan_duration
---------------------------------------------------------------------------------------
1 | 60000 | 3
2 | 80000 | 4
---------------------------------------------------------------------------------------
贷款还款
---------------------------------------------------------------------------------------
id | loan_id | amount | month | status
---------------------------------------------------------------------------------------
1 | 1 | 20000 | 1 | Pending
2 | 1 | 20000 | 2 | Pending
3 | 1 | 20000 | 3 | Pending
4 | 2 | 20000 | 1 | Pending
5 | 2 | 20000 | 2 | Pending
6 | 2 | 20000 | 3 | Pending
7 | 2 | 20000 | 4 | Pending
我只想从整个两个表中获取每笔贷款的贷款金额及其各自支付的月数。我正在做这样的查询。
SELECT loan.`loan_amount`, COUNT(loan_repayment.`loan_id`) FROM loan
LEFT OUTER JOIN loan_repayment ON
(loan.`id`=loan_repayment.`loan_id` AND loan_repayment.`status`='Paid' )
GROUP BY loan_repayment.`loan_id`
我在这里使用了左外连接,即使根据 where 子句,loan_repayment 表为空,我仍然可以得到结果为 0。但问题是,它只返回以下数据。我不知道为什么它现在返回以下(贷款)行。
---------------------------------------------------------------------------------------
loan_amount | count(loan_repayment.loan_id)
---------------------------------------------------------------------------------------
60000 | 0
---------------------------------------------------------------------------------------
实际上我已经创建了一个包含许多其他限制的 Hibernate 标准,但是在进一步研究生成的 sql 后,它缩小到这一点。为什么第 2 行数据及其子数据不包含在建议的 sql 的结果中?
如果可以在休眠条件下复制它也会很有帮助(没什么大不了的,我可以弄清楚,但担心那个 sql 的结果)。
更新:
如果我从
更改查询loan_repayment.`status`='Paid'
到
loan_repayment.`status`='Pending'
我得到以下结果
---------------------------------------------------------------------------------------
loan_amount | count(loan_repayment.loan_id)
---------------------------------------------------------------------------------------
60000 | 3
80000 | 4
---------------------------------------------------------------------------------------
对于完全相反的条件,为什么它没有产生与计数为 0 相同的结果,这有点奇怪。
【问题讨论】:
-
那是你的全桌吗?从我所看到的情况来看,您的结果对于您的查询来说是正确的。贷款 1(对于 6000)没有任何还款,因此该笔的还款总数应为 0。当您将其更改为待处理时,有 3 笔贷款还款,因此有 3 笔。或者我误解了你的问题吗?如果您的意思是它应该返回空值,请尝试仅使用
loan_id而不是作为计数进行左连接,然后查看它返回的内容。 -
是的,如果条件未决,它会返回 3 和 4,那么为什么它没有对已付条件执行相反的操作,每行的预期输出为 0 和 0。不管怎样,我会试试你的建议。但我乞求了解问题所在。我猜问题的原因在于我的 group by 声明。
-
@nomistic,如果我删除 count 和 group by ,我会得到预期的行数,但如果没有计数功能,我无法获得付费行数
-
它确实返回了 0; 0 和 0 之和为 0。没有标记为“已付款”的付款。我在想发生了什么,它正在对空值求和并将它们视为 0。有趣。还有一件事,你可以尝试按
loan.loan_amount分组吗? -
无论如何,既然您要查找的是标记为已付款的付款总数,那么 0 实际上是正确答案,对吧?