我的数据库中有这三个表:
tblCustomer (id,name,address)
tblLoan (id,customerId,LoanAmount,date)
tblPayment (id,customerId,ReceivedAmount,date)
我想找到客户的总贷款金额以及他们已支付的金额。
我写了这个查询:
SELECT c.fname, SUM(l.amount), SUM(p.amount)
FROM tblCustomer c
JOIN tblLoan l ON (l.customerId = c.id)
JOIN tblPayment p ON (p.customerId = c.id)
WHERE c.id = 3;
它返回结果,但它们不正确。
最佳答案
首先,正如其他人所提到的,您的语法可能不正确,因为您没有匹配的列名,但您说您的结果不正确,所以我认为这不是您的问题,因为您能够运行查询。
我认为您最有可能遇到的问题是,通过像这样将两个表连接在一起,每个客户的行出现两次。假设您的“不正确”结果是您期望的两倍,我是否正确?不明白的我来举例说明。考虑这个数据集,具有缩短的列值:
tbl客户:
| id | name |
+----+------+
| 1 | Adam |
| 2 | John |
| 3 | Jane |
tblLoan,为简单起见,我们假设付款表看起来相同:
| customerID | loanAmount |
+------------+------------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
| 3 | 300 |
| 2 | 200 |
如果我执行以下查询(没有求和值,只是获取我想要的值:
SELECT c.id, c.name, l.loanAmount, p.receivedAmount
FROM tblCustomer c
JOIN tblLoan l ON l.customerid = c.id
JOIN tblPayment p ON p.customerid = c.id
WHERE c.id = 3;
它返回这个结果集:
| id | name | loanAmount | receivedAmount |
+----+------+------------+----------------+
| 3 | Jane | 100 | 100 |
| 3 | Jane | 100 | 300 |
| 3 | Jane | 300 | 100 |
| 3 | Jane | 300 | 300 |
请注意,因为我们根据与第三个表的关系连接两个表,实际上是在创建导致问题的笛卡尔积。因此,我建议您对这两个表使用子查询。一个子查询将提取贷款值,一个提取付款值,您可以将它们连接到 id 值上。
它看起来像这样:
SELECT t.id, t.totalLoan, w.totalReceived
FROM(SELECT c.id, SUM(l.loanAmount) AS totalLoan
FROM tblCustomer c
JOIN tblLoan l ON l.customerid = c.id
WHERE c.id = 3) t
JOIN(SELECT c.id, SUM(p.receivedAmount) AS totalReceived
FROM tblCustomer c
JOIN tblPayment p ON p.customerid = c.id
WHERE c.id = 3) w
ON t.id = w.id;
这应该会为您提供所需的值。这是我在 SQL Fiddle 上测试的内容.
关于mysql - 三表连接的结果不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830819/