1

我在让这个 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,但当 adtracking 表中没有那么多行时,它的值会超过 3,000。为什么是这样?这里有什么问题?

4

1 回答 1

2

您的问题是您没有连接条件,因此您将每个表的每一行都连接到查询结果中 - 称为笛卡尔积

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

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

你没有为你的表提供架构,所以我猜到了相关列的名称——你可能需要调整它们。此外,您的交易表可能会加入 adtracking - 从您的问题中不可能知道,所以您必须稍微改变一下。希望你明白这一点。

编辑:

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

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

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

于 2013-04-28T03:45:10.190 回答