我有一个带有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移除联接,则费用列会显示正确的结果。
任何帮助都将不胜感激。
答案 0 :(得分:0)
最后,我不得不使用3个不同的查询并对它们进行合并。看起来像是一个开销,但为我工作。