Я могу ошибаться, но из того, что я понимаю
- conversions.id - это первичный ключ вашей таблицы преобразований
- 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 ([клики]) x sizeof ([конверсии]) строк
Как вы отметили, количество уникальных конверсий в вашем запросе можно получить через
count(distinct conversions.id) = sizeof([conversions])
это отличное удаляет все строки [щелчков] в декартовом произведении
но ясно
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;
Держите меня в курсе!
Джером