MySQL查询中的多个连接会产生错误的结果

时间:2012-07-24 14:22:34

标签: php mysql left-join

我有一个带有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

我得到的结果是: enter image description here

问题是收入和费用结果太高了,因为对于观看次数,点击次数和展示次数,只计算不同的行,但出于某种原因(我真的很感谢这里的解释)所有行中的所有行都计算在内表格被带入结果集。

我知道这是一个大型查询,但点击和转化表都依赖于用于过滤结果的视图表,例如views.country ='uk'。我已经尝试过3个查询并将它们合并,但这不起作用(它给了我错误的结果)。

我觉得奇怪的另一件事是,如果我通过点击,转化,c_profiles移除联接,则费用列会显示正确的结果。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

最后,我不得不使用3个不同的查询并对它们进行合并。看起来像是一个开销,但为我工作。