Potrei sbagliarmi ma da quello che ho capito
- id conversioni è la chiave primaria della tua tabella conversioni
- stats.id è la chiave primaria della tua tabella statistiche
Pertanto, per ogni conversions.id hai al massimo un link.id interessato.
La tua richiesta è un po' come fare il prodotto cartesiano di 2 set :
[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
e per ogni link, ottieni sizeof([clicks]) x sizeof([conversions]) righe
Come hai notato, il numero di conversioni uniche nella tua richiesta può essere ottenuto tramite un
count(distinct conversions.id) = sizeof([conversions])
questo distinto riesce a rimuovere tutte le righe [clic] nel prodotto cartesiano
ma chiaramente
sum(conversions.value) = sum([conversions].value) * sizeof([clicks])
Nel tuo caso, poiché
count(*) = sizeof([clicks]) x sizeof([conversions])
count(*) = sizeof([clicks]) x count(distinct conversions.id)
hai
sizeof([clicks]) = count(*)/count(distinct conversions.id)
quindi testerei la tua richiesta con
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;
Tienimi aggiornato! Jerome