Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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 COUNT(licenses.licenseID) AS total FROM licenses GROUP BY licenses.licensetypeID 结果: total ===== 389 14 2 5 3 1 1 现在我想总结一下许可证带来的利润。表交易包含来自PayPal的所有交易。我用mc\u gross来总结。有时会有退款,因此mc_gross为负数,交易量大于许可

在简单工作查询中,列出每种许可证类型的许可证数量:

查询:

SELECT
  COUNT(licenses.licenseID) AS total
FROM
  licenses
GROUP BY
  licenses.licensetypeID
结果:

total
=====
389
 14
  2
  5
  3
  1
  1
现在我想总结一下许可证带来的利润。表
交易
包含来自PayPal的所有交易。我用
mc\u gross
来总结。有时会有退款,因此
mc_gross
为负数,交易量大于许可证

在我当前的数据库中,四个许可证被删除,因为交易被退款

我的尝试:

SELECT
  COUNT(licenses.licenseID) AS total,
  SUM( transactions.mc_gross ) AS gross
FROM
  licenses
  LEFT JOIN transactions ON licenses.txn_id = transactions.txn_id
GROUP BY
  licenses.licensetypeID
结果是:

393     9020.00
 14     NULL
  2     NULL
  5     NULL
  3     100.00
  1     NULL
  1     NULL
请注意,第一个许可证类型现在比第一个查询总共多了四个。从这一点,我推断它正在计算事务表中的额外行数。但我不明白为什么,因为我认为
左连接将占用左表
许可证的所有行,并连接到任何可用的
事务

在阅读不同的连接时,我无法理解它们以产生我想要的结果

我是否正在进行错误的连接?还是按错误的值分组

请注意,我确实希望列出所有许可证类型,即使它们的总和为零


(如果需要整个表结构,请告诉我-我跳过了它以避免问题太长。我希望包含所有相关信息。)

可能有多个事务具有相同的
TXN\u ID
。在这种情况下,加入将在每个匹配的交易中列出一次相同的许可证。

如果退款作为负金额输入到交易表中,则不应删除原始交易。两者都需要存在,才能使总余额为0。由于您看到的交易比您想象的多4笔,并且您知道有4笔退款,我想说,原始交易和退款交易都在交易表中,它们应该在交易表中。

由于我得到的评论,我成功创建了一个产生正确结果的查询:

SELECT
  COUNT( distinct licenses.licenseID ) AS total,
  SUM( temp.mc_gross / temp.quantity ) AS gross
FROM
  licenses
  LEFT JOIN
    ( SELECT txn_id, mc_gross, quantity
      FROM transactions
      WHERE valid = 'VERIFIED-PAID'
    ) AS temp ON licenses.txn_id = temp.txn_id
GROUP BY
  licenses.licensetypeID
正确数据:

total   gross
===================
389     7780.000000
 14     NULL
  2     NULL
  5     NULL
  3     60.000000
  1     NULL
  1     NULL
更新-改进的查询:

SELECT
  COUNT( licenses.licenseID ) AS total,
  SUM( transactions.mc_gross / transactions.quantity ) AS gross
FROM
  licenses
  LEFT JOIN transactions ON licenses.txn_id = transactions.txn_id AND transactions.valid = 'VERIFIED-PAID'
GROUP BY
  licenses.licensetypeID

啊,对。看看数据。有时会记录事务,但它正在等待处理。在这些情况下,将发生具有相同
txn\u id
的第二笔交易。这就是它的缺点。请尝试计数(distinct license.licenseid)以避免计数duplidates@Jason:那纠正了我的计数。但现在我看到了另一个问题。总利润也是错误的。但这是由于@StilesCrisis提到的,有时会出现重复的
txn_id
,因为他们的付款一直在等待。看起来我需要过滤掉这些。你是对的,这不是我的退款。它是重复的
txn\u id
条目,因为偶尔的未决付款会导致具有相同
txn\u id
的重复交易条目。我现在根据@StilesCrisis的评论看到了这一点。如果我是正确的,但在退款时,每个许可证都有真实的副本,而不仅仅是多个交易,那么您的无差别计数将大于(许可证计数+退款计数)。我想你可以在你的
JOIN
ON
子句中签入
valid='VERIFIED-PAID'
。@StilesCrisis:是的!是的!我不知道你能做到。更简单,更容易阅读。非常感谢。