Może się mylę, ale z tego, co rozumiem
- conversion.id jest kluczem podstawowym Twojej tabeli konwersje
- stats.id jest kluczem podstawowym Twojej tabeli statystyki
Tak więc dla każdego Conversion.id, na który ma wpływ co najwyżej jeden links.id.
Twoja prośba jest trochę jak robienie kartezjańskiego produktu z 2 zestawów:
[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
a dla każdego linku otrzymasz sizeof([kliknięcia]) x sizeof([conversions]) linii
Jak zauważyłeś, liczbę unikalnych konwersji w Twoim żądaniu można uzyskać za pośrednictwem
count(distinct conversions.id) = sizeof([conversions])
ten odrębny usuwa wszystkie linie [kliknięć] w produkcie kartezjańskim
ale wyraźnie
sum(conversions.value) = sum([conversions].value) * sizeof([clicks])
W twoim przypadku, ponieważ
count(*) = sizeof([clicks]) x sizeof([conversions])
count(*) = sizeof([clicks]) x count(distinct conversions.id)
masz
sizeof([clicks]) = count(*)/count(distinct conversions.id)
więc przetestowałbym twoją prośbę za pomocą
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;
Informuj mnie !Jerome