sql >> Databasteknik >  >> RDS >> Mysql

MYSQL sum() för distinkta rader

Jag kan ha fel men vad jag förstår

  • conversions.id är den primära nyckeln av dina tabell omvandlingar
  • stats.id är den primära nyckeln av din tabells statistik

För varje konverterings.id har du alltså högst ett länk.id som påverkas.

Din begäran är lite som att göra den kartesiska produkten med 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 

och för varje länk får du sizeof([klick]) x sizeof([conversions]) rader

Som du noterade kan antalet unika omvandlingar i din begäran erhållas via en

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

denna distinkta lyckas ta bort alla [klick]-linjer i den kartesiska produkten

men klart

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

I ditt fall, sedan

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

du har

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

så jag skulle testa din begäran med

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;

Håll mig uppdaterad !Jerome



  1. Bästa praxis för flerspråkig databasdesign

  2. Hur LOAD_FILE()-funktionen fungerar i MySQL

  3. Hur skapar man ett index för element i en array i PostgreSQL?

  4. Bindande variabel till tabellnamn med cx_Oracle