Ik kan het mis hebben, maar voor zover ik het begrijp
- conversions.id is de primaire sleutel van uw tabel conversies
- stats.id is de primaire sleutel van uw tabel statistieken
Dus voor elke conversies.id heeft u maximaal één link.id beïnvloed.
Je verzoek lijkt een beetje op het cartesiaanse product van 2 sets:
[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
en voor elke link krijg je sizeof([clicks]) x sizeof([conversions]) regels
Zoals u heeft opgemerkt, kan het aantal unieke conversies in uw verzoek worden verkregen via een
count(distinct conversions.id) = sizeof([conversions])
dit onderscheid slaagt erin om alle [kliks]-lijnen in het cartesiaanse product te verwijderen
maar duidelijk
sum(conversions.value) = sum([conversions].value) * sizeof([clicks])
In jouw geval, sinds
count(*) = sizeof([clicks]) x sizeof([conversions])
count(*) = sizeof([clicks]) x count(distinct conversions.id)
je hebt
sizeof([clicks]) = count(*)/count(distinct conversions.id)
dus ik zou je verzoek testen met
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;
Houd me op de hoogte !Jerome