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

Statistiche con Tcl e MySQL

Quello di cui hai bisogno qui è una query SQL leggermente elaborata. Sarà composto da sottoquery.

Il primo è questo (violino ). Ti dà il numero totale di oggetti apriporta per ogni nome.

 SELECT COUNT(*) total, name FROM stats GROUP BY name

Il prossimo è questo (violino ). Ti dà il numero di aperture per porta e nome.

SELECT COUNT(*) bydoor, name, door FROM stats GROUP BY name, door

Il terzo (violino ) incorpora il secondo e ti dà una riga per ogni nome, mostrando le porte che si aprono.

SELECT name, 
       GROUP_CONCAT(CONCAT(bydoor,'X',' door ', door) ORDER BY bydoor DESC) details
  FROM (   SELECT COUNT(*) bydoor,
                  name,
                  door
             FROM stats
            GROUP BY name, door
        ) s
  GROUP BY name

Infine, hai bisogno di un JOIN per collegare insieme quelle sottoquery, di questo modulo.

   SELECT t.name, t.total, d.details
     FROM ( .... the first subquery ....) t
     JOIN ( .... the second subquery .... ) d ON t.name = d.name
    ORDER BY t.total DESC, t.name

Tutto spiegato sembra così (violino ). Lo metti nel tuo sql variabile e sei a posto. È solo una stringa multilinea.

set sql {SELECT t.name, t.total, d.details
  FROM (SELECT COUNT(*) total, name FROM stats GROUP BY name) t
  JOIN (  SELECT name, 
                 GROUP_CONCAT(CONCAT(bydoor,'X',' door ', door) ORDER BY bydoor DESC) details
            FROM (   SELECT COUNT(*) bydoor,
                            name,
                            door
                       FROM stats
                      GROUP BY name, door
                 ) s
           GROUP BY name
        ) d ON t.name = d.name
  ORDER BY t.total DESC, t.name}

Quindi c'è una query composta da un mucchio di query nidificate.

Ci sono alcuni trucchi da imparare per migliorare l'analisi dei dati SQL.

  1. uso di GROUP BY
  2. nidificazione delle query, nota anche come sottoquery. Puoi pensare alle sottoquery come a tabelle virtuali.
  3. (avanzato) GROUP_CONCAT .