0

我有一个带有 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 的连接,成本列会显示正确的结果。

任何帮助,将不胜感激。

4

1 回答 1

0

最后,我不得不使用 3 个不同的查询并对它们进行合并。似乎是开销,但对我有用。

于 2012-10-01T10:32:15.210 回答