php - mysql查询左连接的两个表-得到错误的结果

标签 php mysql

我用左连接连接两个表以获得总和结果,但它给出了错误的结果。这是我的

table1
    | id | event | currency | amount |
    |----|-------|----------|--------|
    | 1  | HSA   | USD      | 2000   |
    | 2  | DMME  | USD      | 3000   |
    | 3  | HSI   | INR      | 1500   |
    | 4  | HSI   | INR      | 1500   | 

表2

| id | table1_id | rcvamount | adjamount |
|----|-----------|-----------|-----------|
| 1  | 1         | 1980      | 20        |
| 2  | 2         | 1000      | 180       |
| 3  | 2         | 1500      | 20        |
| 4  | 4         | 1487      | 13        |

这是我的问题

SELECT
T1.event,T1.currency,
SUM(T1.total) AS Totalvalue,

SUM(T1.received) AS Received, 
(T1.bal) AS balance
FROM (SELECT
      table1.id,
      table1.amount AS total,

      SUM(table2.rcvamount+table2.adjamount) AS received,
      ((table1.amount)- sum(table2.rcvamount+table2.adjamount)) AS bal,
      table1.event,  
      table1.currency
      FROM table1 LEFT JOIN table2 ON table1.id=table2.table1_id 
     group by table1.id)T1
      Group By T1.event,T1.currency

但是当我运行此查询时给出如下错误结果。当涉及到名为 HSI 的第三个事件时,表 2 中没有任何 ID 号为 3 的行。结果应按事件和货币分组。

| event | currency | Totalvalue | Received | balance |
|-------|----------|------------|----------|---------|
| DMME  | USD      | 3000       | 2700     | 300     |
| HSA   | USD      | 2000       | 2000     | 0       |
| HSI   | INR      | 3000       | 1500     | NULL    |

但实际结果应该如下所示

| event | currency | Totalvalue | Received | balance |
|-------|----------|------------|----------|---------|
| DMME  | USD      | 3000       | 2700     | 300     |
| HSA   | USD      | 2000       | 2000     | 0       |
| HSI   | INR      | 3000       | 1500     | 1500    |

我不知道我的查询哪里出错了。请帮我解决这个问题。谢谢。

最佳答案

您正在使用 LEFT JOIN 因此您将拥有所有第一个表行,即使它们在第二个表中没有任何匹配所需的连接。

在您的情况下,第一个表中的 id=3 在第二个表中没有匹配项,因此您得到 NULL 结果。 (SELECT * FROM table2 WHERE table1_id =3 将给出 0 个结果)。

要避免这种情况,请使用 INNER JOIN :

SELECT T1.event, T1.currency, SUM( T1.total ) AS Totalvalue, 
       SUM( T1.received ) AS Received, ( T1.bal) AS balance
    FROM (
     SELECT table1.id, table1.amount AS total, 
     SUM( table2.rcvamount + table2.adjamount ) AS received, 
     ((table1.amount) - sum( table2.rcvamount + table2.adjamount ))AS bal,
     table1.event, table1.currency
     FROM table1
     INNER JOIN table2 ON table1.id = table2.table1_id
    GROUP BY table1.id
   )T1

 GROUP BY T1.event, T1.currency

更新:

试试这个,COALESCE() 会将每个 null 转换为 0

SELECT T1.event, T1.currency, SUM( T1.total ) AS Totalvalue, SUM( T1.received ) AS Received, (
T1.bal
) AS balance
FROM (

SELECT table1.id, table1.amount AS total, SUM( COALESCE( table2.rcvamount, 0 ) + COALESCE( table2.adjamount, 0 ) ) AS received, (
COALESCE( table1.amount, 0 ) - sum( COALESCE( table2.rcvamount, 0 ) + COALESCE( table2.adjamount, 0 ) )
) AS bal, table1.event, table1.currency
FROM table1
LEFT JOIN table2 ON table1.id = table2.table1_id
GROUP BY table1.id
)T1
GROUP BY T1.event, T1.currency

关于php - mysql查询左连接的两个表-得到错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37593030/

相关文章:

MySQL 3D "Flood Fill"实现

Mysql 获取分组的两个表列的总和

php - 我丢失了 WordPress 管理员密码

javascript - 将数据插入数据库而不重新加载页面(PHP + Jquery)

php - 为订单添加固定折扣值

javascript - jQuery DataTable数据排序后消失

Mysql - 过程中的 IN 子句用于在过程中声明游标

mysql - 基于部分字符串值限制 MYSQL 查询的结果

php - PDO - fatal error : Call to a member function fetch() on a non-object

php - 无法在 Objective-C 中检索 json 数据