Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 三个表联接的结果不正确_Mysql_Sql_Join - Fatal编程技术网

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不会有任何结果。但是他们得到的结果不正确,所以我假设他们至少可以运行并执行他们的查询。他得到的结果不正确,但没有向我们显示结果。此外,我真的不明白——当使用错误的列名时,他应该如何得到结果?是的,对不起,用大写和加粗的字眼来形容这些短语似乎很苛刻。对不起。