• User Attivo

    Select MySQL con JOINT e somma di valori

    Salve ragazzi,

    sono alle prese con una query abbastanza complessa, che non riesco a smatassare.

    La abbrevio per semplicità, lasciando solo i campi essenziali delle tabelle:

    
    "SELECT utenti.id, utenti.cognome, ordini.id_cliente, ordini.totale as totale 
    FROM utenti 
    LEFT JOIN ordini 
    ON utenti.id=ordini.id_cliente 
    WHERE utenti.id >10 
    ORDER BY totale DESC 
    LIMIT 0,20"
    
    

    Ora, questa query funziona benissimo, solo che per ogni utente, mi restituisce tanti valori quanti sono quelli contenuti nella tabella ordini.
    Ho invece la necessità di sommare i valori del campo ordini.totale relativi a ciascun utente, affinchè ad ogni utente corrisponda una sola riga restituita.

    Certo, potrei anche calcolare dopo la somma, ma, per ragioni che non mi dilungo a spiegare, questo non mi è consentito e vorrei riuscire a farlo tramite la funzione SUM(), che però non sembra funzionare.

    Mi sapete spiegare il perchè?


  • Consiglio Direttivo

    Ciao kru 😉

    Non ne sono sicurissimo ma credo che dovresti modificarla così 😉

    "SELECT utenti.id, utenti.cognome, ordini.id_cliente, SUM(ordini.totale) as totale 
    FROM utenti 
    LEFT JOIN ordini 
    ON utenti.id=ordini.id_cliente 
    WHERE utenti.id >10 
    ORDER BY totale DESC 
    LIMIT 0,20"
    

    Facci sapere se funziona 😄


  • User Attivo

    Ciao Samiorn,

    anzitutto grazie per la gentile risposta.
    Non ti nascondo che quando accennavo al fatto di aver tentato l'utilizzo si SUM() senza successo è proprio questo metodo che ho utilizzato 🙂

    Ho ritentato nuovamente, dato che ho avuto la conferma di non aver poi sbagliato più di tanto, ed anche adesso non funziona, purtroppo.

    Però, questa volta ho modificato la mia query inserendo la restituzione dell'errore e questo è il risultato:

    Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

    Ora, è evidente che l'utilizzo di SUM() preveda obbligatoriamente anche la clausola group by. Quindi è questa, alla fin fine, che mi raggruppa i risultati in uno solo.

    Mi sai dire come va inserita all'interno della mia query?
    Grazie ancora 🙂


  • Consiglio Direttivo

    Ecco perché ero in dubbio 😄
    mi suonava strano...sentivo che qualcosa non andava :lol:

     "SELECT utenti.id, utenti.cognome, ordini.id_cliente, SUM(ordini.totale) as totale 
    FROM utenti 
    LEFT JOIN ordini 
    ON utenti.id=ordini.id_cliente 
    WHERE utenti.id >10 
    GROUP BY utenti.id
    ORDER BY totale DESC 
    LIMIT 0,20"
    
    ```giustamente lui la somma te la fa....ma secondo quale metodo di aggregazione??
    Scusami, non la uso da tanto e quindi mi era passato di mente ;)
    Attendiamo buone news :D
    
    P.S. mi viene solo il dubbio che forse invece di utenti.id dovresti mettere ordini.id_cliente, prova un po' ;)

  • User Attivo

    No, Samyorrn, la prima risposta è quella che conta.
    Si dice così e forse è vero... funziona 😉

    Grazie mille per l'aiuto 🙂

    :ciauz:


  • Consiglio Direttivo

    Di nulla, alla prossima 😉