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

すべてが機能していますが、クエリで生成している「インプレッション」列については、必要以上に大きな数値を取得しています。たとえば、このクエリに一致する 1 つのアプリの「インプレッション数」は 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

テーブルのスキーマを提供していないため、関連する列の名前を推測しました-それらを調整する必要があるかもしれません. また、トランザクション テーブルがアドトラッキングに参加する可能性があります。質問からはわかりません。そのため、少し変更する必要があります。うまくいけば、あなたはアイデアを得る。

編集:

注: group-by 句が正しくありません。アプリのすべての列を一覧表示するか (推奨されません)、アプリから id 列のみを選択するように選択を変更する必要があります (推奨)。選択を次のように変更します。

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

そうしないと、奇妙で​​不正確な結果が得られます。

于 2013-04-28T03:45:10.190 に答える