为什么我在连接两个表的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:是的!是的!我不知道你能做到。更简单,更容易阅读。非常感谢。