SQL Sum查询表现奇怪吗?

时间:2013-04-28 03:41:20

标签: mysql sql database subquery

我遇到了使这个SQL查询正常工作的问题。

我有以下查询

SELECT apps.*, 
SUM(IF(adtracking.appId = apps.id AND adtracking.id = transactions.adTrackingId, transactions.payoutAmount, 0)) AS 'revenue', 
SUM(IF(adtracking.appId = apps.id AND adtracking.type = 'impression', 1, 0)) AS 'impressions'
FROM apps, adtracking, transactions 
WHERE apps.userId = '$userId' 
GROUP BY apps.id

一切正常,但对于我在查询中生成的“展示次数”列,我得到的数字比应有的数字大。例如,此查询的一个匹配应用应该只有72个“展示次数”,但是当广告跟踪表中甚至没有那么多行时,它会提供超过3,000的值。为什么是这样?这有什么不对?

1 个答案:

答案 0 :(得分:2)

您的问题是您没有加入条件,因此您在查询结果中 每个表的每个行都被< - > 笛卡尔积< / em>的

要修复,请将FROM子句更改为:

FROM apps a
LEFT JOIN adtracking ad ON ad.appId = a.id
LEFT JOIN transactions t ON t.adTrackingId = ad.id

您尚未提供表格的架构,因此我猜到了相关列的名称 - 您可能需要调整它们。此外,您的交易表可能会加入到广告跟踪中 - 从您的问题中无法知道,因此您必须稍微改变一下。希望你明白了。

编辑:

注意:您的group-by子句不正确。您需要列出每一列应用程序(不推荐),或将您的选择更改为仅从应用程序中选择id列(推荐)。将您的选择更改为:

SELECT apps.id,
-- rest of query the same

否则你会得到奇怪的,不正确的结果。