2012-07-24 55 views
0

我有一个大的MySQL查询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来移除连接,费用列将显示正确的结果。

任何帮助,将不胜感激。

+0

尝试删除“GROUP BY”并手工计算总和。然后你会明白。 'SUM'为每个组添加所有内容,而不考虑任何表中的不同行。 – mellamokb 2012-07-24 14:25:41

+0

好的。我明白了,但我如何强制它只是不同的行? – Ignas 2012-07-24 14:31:06

+1

您需要在子查询中执行此SUM并将父表连接到已经汇总的结果。这样你的连接不会重复行。 – 2012-07-24 14:32:07

回答

0

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