Php mysql查询两个具有左联接的表-得到错误的结果
我用左连接连接两个表以获得求和结果,但它给出了错误的结果。这是我的Php mysql查询两个具有左联接的表-得到错误的结果,php,mysql,Php,Mysql,我用左连接连接两个表以获得求和结果,但它给出了错误的结果。这是我的 table1 | id | event | currency | amount | |----|-------|----------|--------| | 1 | HSA | USD | 2000 | | 2 | DMME | USD | 3000 | | 3 | HSI | INR | 1500 | | 4 | HSI
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 |
我的查询没有出错。请帮我整理一下。谢谢。这对您有用
select tp.id,tp.event,tp.currency,
tp.totalvalue,
tr.received,
(tp.totalvalue - tr.received) AS balance
from
(
select max(id)id,event,currency,amount,sum(amount)as totalvalue from t1
group by t1.event
)tp
inner join
(
select id,table1_id,rcvamount,adjamount,(sum(rcvamount) + sum(adjamount))as received
from t2
group by table1_id
order by t2.adjamount desc
)tr
on tp.id = tr.id
group by tp.event
您正在使用
左联接
,因此您将拥有所有第一个表行,即使它们在第二个表中与所需联接不匹配
在第一个表中,id=3在第二个表中没有匹配项,因此得到的结果为空。(从表2中选择*,其中表1\u id=3
将给出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( 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
这是给错误的结果,甚至没有关闭我的结果。我已经更新了我的代码和它的工作良好…实际上之前我很匆忙地复制了你的错误代码,因此你应该真正解释为什么你认为这会工作。因为我已经在本地测试了它和它的工作良好否,向OP解释为什么它能解决他们的问题。但我想把表1中的第4行包含在内。如果我运行您的查询,它会吐出表1中的第4行。包括HSI事件的第4行,总金额为3000,总接收金额为1500,因此余额应为1500。我只希望左连接。。