Mysql
 sql >> Base de données >  >> RDS >> Mysql

MYSQL sum() pour des lignes distinctes

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