mysql - 预期结果不是来自 mysql INNER JOIN

标签 mysql group-by inner-join having

我有以下两个表:

table: loan
--------------------------------------------------------
 id | advance_id | loan_amount | deposit_amount | date
--------------------------------------------------------
 1 | 22556678 | 5000 | 0 | 2015-02-06
--------------------------------------------------------

table: advance
--------------------------------------------------------
id | advance_id | advance_amount | purpose | date
--------------------------------------------------------
 1 | 22556678 | 20000 | purchase | 2015-01-30
 2 | 22556678 | 10000 | purchase | 2015-01-31
--------------------------------------------------------

我的代码是:

SELECT a.advance_id, sum(a.advance_amount) as adv_amount, a.purpose, a.date, sum(l.loan_amount) as loan_amount FROM advance as a INNER JOIN loan as l ON a.advance_id=l.advance_id GROUP BY a.advance_id HAVING sum(l.loan_amount)-sum(l.deposit_amount)>0

说明: 表“advance”是用于预付款的表,表“loan”是用于贷款帐户的表。出于同一目的(此处用于购买产品),可以多次提取预付款。每个预付款都由预付款 ID 标识。由于两次预付款是出于同一目的(此处用于购买产品),因此它们将具有相同的 advance_id。另一方面,贷款是针对任何预付款而获取的。同一笔预付款也可以多次申请贷款。如果需要偿还任何贷款,则会将其插入到 advance_id 对应的 Deposit_amount 列中。

在loan_page.php中,仅当有任何贷款未支付/未调整时才会显示贷款。为了识别它,我必须通过以下代码根据相同的预付款 ID 计算贷款和存款列:

GROUP BY a.advance_id HAVING sum(l.loan_amount)-sum(l.deposit_amount)>0

然后,如果有任何贷款未付,我必须确定每个 advance_id 提取了多少贷款。所以我还必须选择以下内容:

sum(l.loan_amount)

我获取的输出将是:

echo 'Total loan Amount: '.$row['loan_amount'].'<br />';
echo 'Advance ID: '.$row['advance_id'].'<br />';
echo 'Advance Amount: '.$row['adv_amount'].'<br />';
echo 'Purpose of Advance: '.$row['purpose'];

上面的代码效果很好,除了总贷款金额翻倍(本例中为 10000),尽管它将是 5000。我认为我的 mysql 查询的 GROUP BY 或 HAVING 子句中有错误。

请告诉我,如何更正代码,使 sum(l.loan_amount) 在本例中为 5000,而不是 10000。

最佳答案

loan_amount 为 double 的原因是因为您使用 advance_id 在表之间进行内部联接。由于 advance_id 在 advance_table 中出现两次,因此贷款行将出现两次。从视觉上看,连接会给你带来这样的结果:

| advance | loan |
|    1    |  1   |
|    2    |  1   |

因此,当您对 l.loan_amount 进行聚合时,它将被计算两次。为了解决这个问题,我会单独对每个表进行聚合,然后将它们连接在一起。例如,只需从贷款表中获取 advance_id 和 SUM(loan_amount),如下所示:

SELECT advance_id, SUM(loan_amount)
FROM loan
GROUP BY advance_id;

我注意到您原来的HAVING子句检查了loan_amount - Deposit_amount,您可以在上面的查询中执行该条件:

SELECT advance_id, SUM(loan_amount) AS totalLoan
FROM loan
GROUP BY advance_id
HAVING SUM(loan_amount) - SUM(deposit_amount) > 0;

接下来,在高级表中自行执行必要的聚合,如下所示:

SELECT advance_id, SUM(advance_amount) AS totalAdvance
FROM advance
GROUP BY advance_id;

然后,我将连接这两个表来获取您需要的值:

SELECT t1.advance_id, t1.totalAdvance, t2.totalLoan
FROM(
  SELECT advance_id, SUM(advance_amount) AS totalAdvance
  FROM advance
  GROUP BY advance_id) t1
JOIN(
  SELECT advance_id, SUM(loan_amount) AS totalLoan
  FROM loan
  GROUP BY advance_id
  HAVING SUM(loan_amount) - SUM(deposit_amount) > 0) t2 ON t2.advance_id = t1.advance_id;

注意

我没有包含目的或日期,因为它们在预先表中不一致。您必须考虑每种情况。如果两行的目的不同怎么办?日期不同,那么您需要返回哪个日期(如果有)?一旦您知道了这一点,您就可以将它们添加到此查询中,可能是在“高级”子查询中。

这是一个SQL Fiddle示例。

关于mysql - 预期结果不是来自 mysql INNER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29720099/

相关文章:

mysql - Django 在运行时修改 DATABASE_HOST

mysql - 为什么在这个 sql 中,函数 AVG() 必须在子查询中?

mysql - sql查询没有正确分组

mysql - 让SQL自动建表

mysql - 获取Mysql汇总数据

mysql - php/mysql - 根据比赛结果(进球)进行计算

SQL 内连接查询返回两个相同的列

SQL Group By - 每月/每年计算记录,插入时出错 - 不是有效的月份

sql - 与 UDF 交叉应用

MySQL 查询 - 仅使用最新版本的条目进行内部连接