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 werdencount(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
testenSELECT 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