0

5つの結合を持つ大きなmysqlクエリがありますが、これは効率的ではないように思われるかもしれませんが、機能する別のソリューションを見つけるのに苦労しています。

ここでは、ビューテーブルがメインテーブルです。これは、クリックテーブルとコンバージョンテーブルの両方がトークン列(すべてのテーブルでインデックスが作成され、外部キーとして設定されている)を介してテーブルに依存しているためです。

クエリ:

SELECT 
var.id,
var.disabled,
var.name,
var.updated,
var.cid,
var.outdated,
IF(var.type <> 0,'DL','LP') AS `type`,
COUNT(DISTINCT v.id) AS `views`, 
COUNT(DISTINCT c.id) AS `clicks`,
COUNT(DISTINCT co.id) AS `conversions`,
SUM(tc.cost) AS `cost`,
SUM(cp.value) AS `revenue`

FROM variants AS var

LEFT JOIN views AS v ON v.vid = var.id
LEFT JOIN traffic_cost AS tc ON tc.id = v.source
LEFT JOIN clicks AS c ON c.token = v.token
LEFT JOIN conversions AS co ON co.token = v.token
LEFT JOIN c_profiles AS cp ON cp.id = co.profile

WHERE var.cid = 28
GROUP BY var.id

私が得ている結果は次のとおりです。 ここに画像の説明を入力してください

問題は、収益と費用の結果が高すぎることです。これは、ビュー、クリック、インプレッションについては個別の行のみがカウントされるためですが、何らかの理由で収益と費用については(ここで説明していただければ幸いです)、すべてのテーブルのすべての行が取得されます。結果セットに。

これは大きなクエリですが、クリック数とコンバージョン数の両方のテーブルは、結果のフィルタリングに使用されるビューテーブルに依存しています(例:views.country ='uk')。3つのクエリを実行してそれらをマージしようとしましたが、うまくいきませんでした(間違った結果が得られました)。

私が奇妙だと思うもう1つのことは、クリック、コンバージョン、c_profilesで結合を削除すると、コスト列に正しい結果が表示されることです。

どんな助けでもいただければ幸いです。

4

1 に答える 1

0

最終的に、3 つの異なるクエリを使用してそれらをマージする必要がありました。オーバーヘッドのように見えましたが、私にとってはうまくいきました。

于 2012-10-01T10:32:15.210 に答える