mysql - 三表连接的结果不正确

标签 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.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/

相关文章:

mysql - 需要稍微修改的 SQL 查询

php - 导出行值仅包含 NULL 值的 MySQL 表

sql - 为什么向分组依据添加列会增加返回的行数

sql - 如何将 UNION 语句转换为 JOIN 语句

mysql - Innodb缓冲池和多重连接

mysql order by 性能优化

mysql - SQL SERVER 查询到 MYSQL 查询

sql - 如何仅显示查询中字段的前 5 位数字

sql - 连接多个表(多对多关系)

mysql - 连接并打印单元格中具有多个值的列的搜索结果