Mysql 三个表联接的结果不正确
我的数据库中有以下三个表:Mysql 三个表联接的结果不正确,mysql,sql,join,Mysql,Sql,Join,我的数据库中有以下三个表: 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.cus
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;
它返回的结果不正确。仅供参考,您的列名错误
表tblCustomer中没有名为fname的列
表tblLoan中没有名为amount的列
表tblPayment中没有名为amount的列
如果没有合适的列名,将无法得到正确的结果。即使使用别名,列名也应与数据库表中的列名完全相同。这是因为,您在联接查询中使用的是表别名,而不是列别名
因此,请按以下方式重新编写查询:
SELECT c.name, SUM(l.LoanAmount), SUM(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
注意,JOIN中的ON子句周围不需要括号 首先,正如其他人所提到的,您的语法可能不正确,因为您没有匹配的列名,但您说您的结果不正确,因此我认为这不是您的问题,因为您能够运行查询 我认为您最可能遇到的问题是,通过这样将两个表连接在一起,每个客户的行都会出现两次。我假设你的“不正确”结果是你预期结果的两倍,对吗?让我为那些不理解的人举例说明。考虑这个数据集,具有缩短的列值: TBL客户:
| id | name |
+----+------+
| 1 | Adam |
| 2 | John |
| 3 | Jane |
TBLLOON,为了简单起见,我们将说付款表看起来是一样的:
| 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;
这会给你想要的值。这是我测试的内容 你的意思是“收到的贷款总额”和“贷款总额”,还是说每笔贷款?啊,你还在做这个吗?我觉得这里的大写字母和粗体字有点苛刻。你的列名错了!!!听起来你是在当着OP的面说他们犯了一个错误。而且,我高度怀疑语法是问题所在。如果是的话,OP不会有任何结果。但是他们得到的结果不正确,所以我假设他们至少可以运行并执行他们的查询。他得到的结果不正确,但没有向我们显示结果。此外,我真的不明白——当使用错误的列名时,他应该如何得到结果?是的,对不起,用大写和加粗的字眼来形容这些短语似乎很苛刻。对不起。