我可能错了,但据我所知,
- conversions.id 是你的表 conversions 的主键
- stats.id 是你的表 stats 的主键
因此,对于每个 conversions.id,您最多只有一个受到影响的 links.id。
您的请求有点像对2个集合进行笛卡尔积操作:
[clicks]
SELECT *
FROM links
LEFT OUTER JOIN stats ON links.id = stats.parent_id
[conversions]
SELECT *
FROM links
LEFT OUTER JOIN conversions ON links.id = conversions.link_id
对于每个链接,你会得到 sizeof([clicks]) x sizeof([conversions]) 行数据。
正如你所提到的,在你的请求中获取唯一转化数的数量可以通过
count(distinct conversions.id) = sizeof([conversions])
这个 distinct 命令成功地删除了笛卡尔积中所有 [clicks] 行,但是...
请注意:这里的 "distinct" 可能是指 SQL 语言中的 DISTINCT 关键字,用于从结果集中去除重复行。
sum(conversions.value) = sum([conversions].value) * sizeof([clicks])
在您的情况下,由于
count(*) = sizeof([clicks]) x sizeof([conversions])
count(*) = sizeof([clicks]) x count(distinct conversions.id)
你有
sizeof([clicks]) = count(*)/count(distinct conversions.id)
所以我会使用以下代码对您的请求进行测试:
SELECT links.id,
count(DISTINCT stats.id) as clicks,
count(DISTINCT conversions.id) as conversions,
sum(conversions.value)*count(DISTINCT conversions.id)/count(*) as conversion_value
FROM links
LEFT OUTER JOIN stats ON links.id = stats.parent_id
LEFT OUTER JOIN conversions ON links.id = conversions.link_id
GROUP BY links.id
ORDER BY links.created desc;
保持联系!
Jerome
GROUP BY
中复制值? - MatthewSUM(DISTINCT column)
。 - phoenix