Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MYSQL sum() für unterschiedliche Zeilen

Ich kann mich irren, aber von dem, was ich verstehe

  • conversions.id ist der Primärschlüssel Ihrer Tabellen-Conversions
  • stats.id ist der Primärschlüssel Ihrer Tabellen-Statistiken

Somit ist für jede Conversions.id höchstens eine Links.id betroffen.

Ihre Anfrage ist ein bisschen wie das kartesische Produkt von 2 Sätzen:

[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 

und für jeden Link erhalten Sie sizeof([clicks]) x sizeof([conversions]) Zeilen

Wie Sie angemerkt haben, kann die Anzahl der eindeutigen Conversions in Ihrer Anfrage über ein

abgerufen werden
count(distinct conversions.id) = sizeof([conversions])

Dieser Unterschied schafft es, alle [Klicks]-Zeilen im kartesischen Produkt zu entfernen

aber deutlich

sum(conversions.value) = sum([conversions].value) * sizeof([clicks])

In Ihrem Fall seit

count(*) = sizeof([clicks]) x sizeof([conversions])
count(*) = sizeof([clicks]) x count(distinct conversions.id)

du hast

sizeof([clicks]) = count(*)/count(distinct conversions.id)

also würde ich deine Anfrage mit

testen
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;

Halt mich auf dem Laufenden !Jerome