我有一个带有 5 个连接的大型 mysql 查询,这可能看起来效率不高,但我正在努力寻找一个可行的不同解决方案。
views 表是这里的主表,因为 clicks 和 conversions 表都通过 token 列(在所有表中被索引并设置为外键)依赖它。
查询:
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 的连接,成本列会显示正确的结果。
任何帮助,将不胜感激。