Query con SELECT COUNT multipli

di il
8 risposte

Query con SELECT COUNT multipli

Per evitare mille righe di codice Php vorrei eseguire una query su più campi in un colpo solo. 

Ho una tabella “mytable” con campi Id, Tipo e Data.

SELECT COUNT(Data) AS Tot
SELECT COUNT(Tipo) AS aaa WHERE Tipo='a'
SELCET COUNT(Tipo) AS bbb WHERE Tipo='b'
etc. 
WHERE id='5'

Ovvio che scritta così è come me la immagino io. Ho provato anche a mettere la riga 2 e 3 tra parentesi ma mi da' errore lo stesso. 

Come potrei “tradurla” in Mysql?

8 Risposte

  • Re: Query con SELECT COUNT multipli

    Se ho capito bene cosa vuoi ottenere, dovresti poter fare così:

    SELECT Tipo, COUNT(*) AS occorrenze FROM `mytable` GROUP BY Tipo

    Questa query dovrebbe produrre un resultset di questo tipo:

    Tipo | occorrenze
    a      8
    b      10
    c      1
    ...

    Per il totale ti basta sommare tra loro tutti valori della colonna occorrenze, lato php verrebbe estremamente comodo usando la combinazione di array_column e array_sum. Ma se vuoi una soluzione in puro SQL, basta usare una UNION per aggiungere al recordset di prima una nuova riga col tipo “totale” e come occorrenze il conteggio di tutti i record.

    SELECT 'totale' AS Tipo, COUNT(*) AS occorrenze FROM `mytable`
    UNION
    SELECT Tipo, COUNT(*) AS occorrenze FROM `mytable`
    GROUP BY Tipo
  • Re: Query con SELECT COUNT multipli

    19/11/2024 - blancks ha scritto:


    uesta query dovrebbe produrre un resultset di questo tipo:

    Tipo | occorrenze
    a      8
    b      10
    c      1
    ...

    Scusa mi sto confondendo. L'array come lo recupero da qui?

  • Re: Query con SELECT COUNT multipli

    L'array è il risultato della query… un insieme di valori indicizzato…

  • Re: Query con SELECT COUNT multipli

    19/11/2024 - ricmanx ha scritto:


    Scusa mi sto confondendo. L'array come lo recupero da qui?

    Nel caso specifico dipende da quale estensione stai utilizzando per dialogare col database nel tuo script php. 
    Generalmente sia mysqli che PDO hanno un loro metodo “fetch all” per permettere di recuperare tutte le righe restituite dall'elaborazione di una query come array, a quel punto puoi trattare i dati secondo necessità

  • Re: Query con SELECT COUNT multipli

    Una query fatta in quel modo, non si può fare. 

    DEVI fare diverse query, eventualmente fai la UNION dei risultati MA lo puoi fare SOLO se tutte le select ritornano lo stesso numero di colonne, con lo stesso nome e lo stesso tipo di dato in ogni colonna. 

    Altrimenti, rullo di tamburi, migliaia di righe di codice ;-)

    Comunque, se sono migliaia di righe di codice, vuol dire che c'e' ben altro che non va! 

  • Re: Query con SELECT COUNT multipli

    SELECT Tipo, COUNT(*) AS occorrenze FROM `mytable`
    GROUP BY Tipo
    union
    SELECT 'TOTALE', COUNT(Tipo) AS occorrenze FROM `mytable`

    per completezza…

  • Re: Query con SELECT COUNT multipli

    20/11/2024 - sihsandrea ha scritto:


    SELECT Tipo, COUNT(*) AS occorrenze FROM `mytable`
    GROUP BY Tipo
    union
    SELECT 'TOTALE', COUNT(Tipo) AS occorrenze FROM `mytable`

    per completezza…

    Ok. In effetti funziona. La eseguo in phpmyadmin e ottengo i valori come mostravi anche tu. 

    Ora forse la mia ignoranza va oltre il mysql perchè l'array che ottengo così 

    While{ ============
    $val[]=[
        $row['Tipo']=>$row['occorrenze']
     ];
     } //end while
     
     print_r($val);
     
     Array ( [0] => Array ( [p] => 2 ) [1] => Array ( [r] => 1 ) [2] => Array ( [TOTALE] => 3 ) )

    A questo punto come recupero i valori per mettere in "bella copia" il tutto? Pensavo di usare “echo $val['p'];” per recuperare il mio valore 2 ma non è così. 

    Vorrei mostrare un testo tipo questo.  Ho registrato un totale di 3 valori di cui 2 sono “p”  e 1 sono “r” 

  • Re: Query con SELECT COUNT multipli

    Un array lo hai con la query, a che serve crearne un altro?

    https://it.siteground.com/tutorial/php-mysql/visualizzare-tabella-dati/

Devi accedere o registrarti per scrivere nel forum
8 risposte