我用左连接连接两个表以获得总和结果,但它给出了错误的结果。这是我的
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/