Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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
mysql减去多个工作不正常的表_Mysql - Fatal编程技术网

mysql减去多个工作不正常的表

mysql减去多个工作不正常的表,mysql,Mysql,我试着减去数值​​从几个表中可以看出,但结果不正确 SELECT SUM(t1.pay_1) - SUM(t2.pay_2) as trx FROM ( SELECT SUM(payment) AS pay_1 FROM tr_order WHERE date = '".$date."' AND agent='".$arr[$y]['name']."' UNION ALL SELECT SUM(nominal) AS pay_1 FROM transaction WHERE date =

我试着减去数值​​从几个表中可以看出,但结果不正确

SELECT SUM(t1.pay_1) - SUM(t2.pay_2) as trx FROM
(
SELECT SUM(payment) AS pay_1
FROM tr_order
WHERE date = '".$date."' 
AND agent='".$arr[$y]['name']."'

UNION ALL

SELECT SUM(nominal) AS pay_1
FROM transaction
WHERE date = '".$date."'
AND to_agent='".$arr[$y]['name']."') AS t1,                                                                               

(SELECT SUM(nominal) AS pay_2
FROM transaction
WHERE date = '".$date."'
AND from_agent='".$arr[$y]['name']."') AS t2                                                                                
t1.pay_1的结果为350000,t2.pay_2的结果为0

但是t1.pay_1-t2.pay_2的结果是0


怎么了?

如果子查询t2或t1返回null,那么主查询将返回null,您应该始终使用coalesce对此进行编码。由于t1可能返回2行,因此在计算trx之前,您应该将pay_1相加,以避免隐式交叉连接加倍。模型和查询的简化版本演示了

drop table if exists t,t1;
create table t(payment int);
create table t1(nominal int, to_agent int, from_agent int);

insert into t values (10),(10);

select 
        payone,
        sum(pay_2) pay2,
        payone - sum(pay_2) pay1_pay2,
        coalesce(payone,0) - sum(coalesce(pay_2,0)) as trx
from
(
select sum(pay_1) payone from
(
select sum(payment) pay_1 from t
union all
select sum(nominal) pay_1 from t1 where to_agent = 1
) s
) a
,
(select sum(nominal) pay_2 from t1 where from_agent = 1) b;

 +------+------+-----------+------+
| pay1 | pay2 | pay1_pay2 | trx  |
+------+------+-----------+------+
|   20 | NULL |      NULL |   20 |
+------+------+-----------+------+
1 row in set (0.001 sec)

如果子查询t2或t1返回null,那么主查询将返回null,您应该始终使用coalesce对此进行编码。由于t1可能返回2行,因此在计算trx之前,您应该将pay_1相加,以避免隐式交叉连接加倍。模型和查询的简化版本演示了

drop table if exists t,t1;
create table t(payment int);
create table t1(nominal int, to_agent int, from_agent int);

insert into t values (10),(10);

select 
        payone,
        sum(pay_2) pay2,
        payone - sum(pay_2) pay1_pay2,
        coalesce(payone,0) - sum(coalesce(pay_2,0)) as trx
from
(
select sum(pay_1) payone from
(
select sum(payment) pay_1 from t
union all
select sum(nominal) pay_1 from t1 where to_agent = 1
) s
) a
,
(select sum(nominal) pay_2 from t1 where from_agent = 1) b;

 +------+------+-----------+------+
| pay1 | pay2 | pay1_pay2 | trx  |
+------+------+-----------+------+
|   20 | NULL |      NULL |   20 |
+------+------+-----------+------+
1 row in set (0.001 sec)

您确定它为0且不为空吗?事务是空表吗?哦,是的,事务是空表,那么我应该怎么做?合并并阅读我的答案。哦,好的,非常感谢。你确定它是0并且不是空的吗?交易是一个空表吗?哦,是的,交易是一个空表,那么我应该怎么做?合并并阅读我的答案。哦,OK,非常感谢非常感谢先生,我只是在我的查询中这样放置了合并:选择合并(pay_1,0)-合并(pay_2,0)作为trx FROM。。。。。。。这是100%的工作。非常感谢非常感谢,先生,我只是在我的查询中添加了coalesce,如下所示:选择coalesce(pay_1,0)-coalesce(pay_2,0)作为trx FROM。。。。。。。这是100%的工作。非常感谢你