Mysql
 sql >> Database >  >> RDS >> Mysql

Come ottenere una percentuale del totale quando la query ha un GROUP BY?

Per set di grandi dimensioni, un JOIN può avere prestazioni migliori rispetto alla sottoquery.

SELECT ma.actor
     , COUNT(1) AS total
     , COUNT(1) / t.cnt * 100 AS `percentage`
  FROM movies_actors ma
 CROSS
  JOIN (SELECT COUNT(1) AS cnt FROM movies_actors) t
 GROUP
    BY ma.actor
     , t.cnt  

Per set di grandi dimensioni e quando viene restituita una grande percentuale di righe, l'operazione JOIN può in genere superare una sottoquery. Nel tuo caso, non è una sottoquery correlata, quindi MySQL non dovrebbe doverlo eseguire più volte, quindi potrebbe non fare alcuna differenza.

Nota per i non fan di COUNT(1) ... potremmo sostituire tutte le occorrenze di COUNT(1) con COUNT(*) o IFNULL(SUM(1),0) per ottenere un risultato equivalente.