从两个不相关的MySQL查询中添加总计

从两个不相关的MySQL查询中添加总计,mysql,subquery,Mysql,Subquery,我正在努力找出正确的MySQL语法来添加两个查询的结果。这些查询从一个表中提取调用记录,两者都生成一个数字结果,我需要将它们相加。我确信这可以通过子查询来完成,但我似乎无法获得正确的语法 以下是查询: SELECT SUM(costres) - SUM(costadmin) FROM call_history, client WHERE MONTH(start) = 3 AND YEAR(start) = 2012 AND call_history.client_reseller_id =

我正在努力找出正确的MySQL语法来添加两个查询的结果。这些查询从一个表中提取调用记录,两者都生成一个数字结果,我需要将它们相加。我确信这可以通过子查询来完成,但我似乎无法获得正确的语法

以下是查询:

SELECT SUM(costres) - SUM(costadmin)
FROM call_history, client
WHERE MONTH(start) = 3 AND YEAR(start) = 2012
  AND call_history.client_reseller_id = client.id
  AND client.charging_identifier <> 100000
  AND client.charging_identifier <> 999999;

SELECT SUM(costcl) - SUM(costadmin)
FROM call_history, client
WHERE MONTH(start) = 3 AND YEAR(start) = 2012
 AND call_history.client_reseller_id = client.id
 AND client.charging_identifier = 100000
 AND client.charging_identifier <> 999999;
选择总和(成本)-总和(成本管理)
从呼叫历史记录,客户端
其中月份(开始)=3年(开始)=2012年
并调用_history.client _reseller _id=client.id
和client.u标识符100000
和client.u标识符99999;
选择SUM(costcl)-SUM(costadmin)
从呼叫历史记录,客户端
其中月份(开始)=3年(开始)=2012年
并调用_history.client _reseller _id=client.id
和client.charging\u标识符=100000
和client.u标识符99999;
正如我所说,我知道这很简单,但我似乎无法理解MySQL中的子查询语法

提前谢谢


George

MySQL在
SELECT
列表子查询中非常灵活,因此您可以执行如下操作,甚至不需要在主查询中使用
FROM
子句

SELECT
  (SELECT SUM(costres) - SUM(costadmin)
   FROM call_history, client
   WHERE MONTH(start) = 3 AND YEAR(start) = 2012
    AND call_history.client_reseller_id = client.id
    AND client.charging_identifier <> 100000
    AND client.charging_identifier <> 999999
   ) + (
    SELECT SUM(costcl) - SUM(costadmin)
    FROM call_history, client
    WHERE MONTH(start) = 3 AND YEAR(start) = 2012
      AND call_history.client_reseller_id = client.id
      AND client.charging_identifier = 100000
      AND client.charging_identifier <> 999999
   ) AS yourSum;
更新: 快速测试告诉我,至少在MySQL 5.6中,您可以在子查询中使用
UNION ALL

如何-

SELECT
    (SUM(IF(client.charging_identifier = 100000, costcl, 0)) - SUM(IF(client.charging_identifier = 100000, costadmin, 0))) +
    (SUM(IF(client.charging_identifier <> 100000, costres, 0)) - SUM(IF(client.charging_identifier <> 100000, costadmin, 0)))
FROM call_history, client
WHERE MONTH(start) = 3 AND YEAR(start) = 2012
AND call_history.client_reseller_id = client.id
AND client.charging_identifier <> 999999;
选择
(总和(如果(client.charging\u identifier=100000,costcl,0))-总和(如果(client.charging\u identifier=100000,costadmin,0)))+
(总和(如果(client.charging\u标识符100000,成本,0))-总和(如果(client.charging\u标识符100000,成本管理,0)))
从呼叫历史记录,客户端
其中月份(开始)=3年(开始)=2012年
并调用_history.client _reseller _id=client.id
和client.u标识符99999;

您想要两行还是一行两列?真的,我只想要两个查询的一个总数,或者一个查询的等价物。哇,太快了!谢谢两位。这么简单,我就知道会是这样。将测试并报告。Michael,您的第二个查询工作正常-第一个也正常,但正如您所说的,有点不太优雅。@B Tongeorge很好,很乐意提供帮助。非常好,这非常有效,比运行两个查询更快。非常感谢所有做出贡献的人。
SELECT
    (SUM(IF(client.charging_identifier = 100000, costcl, 0)) - SUM(IF(client.charging_identifier = 100000, costadmin, 0))) +
    (SUM(IF(client.charging_identifier <> 100000, costres, 0)) - SUM(IF(client.charging_identifier <> 100000, costadmin, 0)))
FROM call_history, client
WHERE MONTH(start) = 3 AND YEAR(start) = 2012
AND call_history.client_reseller_id = client.id
AND client.charging_identifier <> 999999;