Je peux me tromper mais d'après ce que j'ai compris
- conversions.id est la clé primaire de votre tableau conversions
- stats.id est la clé primaire de votre table stats
Ainsi pour chaque conversions.id vous avez au plus un links.id impacté.
Votre requête revient un peu à faire le produit cartésien de 2 ensembles :
[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
et pour chaque lien, vous obtenez sizeof([clicks]) x sizeof([conversions]) lignes
Comme vous l'avez noté, le nombre de conversions uniques dans votre demande peut être obtenu via un
count(distinct conversions.id) = sizeof([conversions])
ce distinct parvient à supprimer toutes les lignes [clics] dans le produit cartésien
mais clairement
sum(conversions.value) = sum([conversions].value) * sizeof([clicks])
Dans votre cas, depuis
count(*) = sizeof([clicks]) x sizeof([conversions])
count(*) = sizeof([clicks]) x count(distinct conversions.id)
vous avez
sizeof([clicks]) = count(*)/count(distinct conversions.id)
donc je testerais ta requête avec
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;
Tenez-moi au courant ! Jérôme