三个表连接的结果不正确

时间:2014-11-09 17:10:31

标签: 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;

它会返回结果,但它们不正确。

2 个答案:

答案 0 :(得分:1)

首先,正如其他人所提到的,你的语法可能不正确,因为你没有匹配的列名,但是你说你的结果不正确,所以我认为你的问题不是你的问题你的查询..

我认为您最有可能的问题是,通过将两个表连接在一起,每个客户的行显示两次。我认为你的错误'是正确的。结果是你所期望的两倍?让我举例说明那些不了解的人。考虑这个数据集,缩短列值:

tblCustomer:

| 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上测试的内容。

答案 1 :(得分:-1)

仅供参考,您的栏目名称错误!!!

  1. fname
  2. 中没有名为tblCustomer的列
  3. amount
  4. 中没有名为tblLoan的列
  5. amount
  6. 中没有名为tblPayment的列

    如果您没有合适的列名,则无法获得正确的结果。即使使用别名,您的列名也应该与数据库表中的完全相同一样。这是因为,您在JOIN次查询中使用 TABLES ,而不是 COLUMNS

    因此,请按以下方式重新编写查询:

    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
    

    请注意,ON中的JOIN子句不需要括号。