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
我得到的结果是:
的问题是收入和成本结果太身高,因为意见,点击和展示只是不同行数被计算,但由于某种原因(我真的很感谢这里的解释),为了收入和成本,所有表中的所有行都被放入结果集中。
我知道这是一个很大的查询,但点击和转换表都依赖于用于过滤结果的视图表,例如, views.country ='uk'。我试着做3个查询并合并它们,但那不起作用(它给了我错误的结果)。
我发现另外一件奇怪的事情是,如果我通过点击次数,转化次数,c_profiles来移除连接,费用列将显示正确的结果。
任何帮助,将不胜感激。
尝试删除“GROUP BY”并手工计算总和。然后你会明白。 'SUM'为每个组添加所有内容,而不考虑任何表中的不同行。 – mellamokb 2012-07-24 14:25:41
好的。我明白了,但我如何强制它只是不同的行? – Ignas 2012-07-24 14:31:06
您需要在子查询中执行此SUM并将父表连接到已经汇总的结果。这样你的连接不会重复行。 – 2012-07-24 14:32:07