Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql查询两个具有左联接的表-得到错误的结果_Php_Mysql - Fatal编程技术网

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。我只希望左连接。。