• User

    Query somma campo con lo stsso idUtente

    Salve a tutti, premetto che ho una conoscenza base sia di mysql che ti php.
    Arrivo al punto, ho diverse query da mettere insieme, ma non riesco ad unirle e visualizzare i risultati che mi servono.
    Iniziamo con una semplice...
    Ho una tabella con questi campi:
    id
    idCitta
    nomeCitta
    abitantiCitta
    idUtente
    nomeUtente

    In output vorrei avere una tabella con un campo in più, chiamiamolo abitantiUtente, che sarebbe la somma di abitantiCitta corrispondente allo stesso utente.
    Ad esempio la tabella originale è questa:
    [TABLE="class: grid, width: 500"]

    [TD]id[/TD]
    [TD]idCitta[/TD]
    [TD]nomeCitta[/TD]
    [TD]abitantiCitta[/TD]
    [TD]idUtente[/TD]
    [TD]nomeUtente[/TD]
    [/TR]

    [TD]1[/TD]
    [TD]1200[/TD]
    [TD]Metropolis[/TD]
    [TD]200[/TD]
    [TD]10[/TD]
    [TD]Filippo[/TD]
    [/TR]

    [TD]2[/TD]
    [TD]1300[/TD]
    [TD]Roma[/TD]
    [TD]120[/TD]
    [TD]19[/TD]
    [TD]Giovanni[/TD]
    [/TR]

    [TD]3[/TD]
    [TD]1400[/TD]
    [TD]Lugano[/TD]
    [TD]87[/TD]
    [TD]19[/TD]
    [TD]Giovanni[/TD]
    [/TR]

    [TD]4[/TD]
    [TD]1500[/TD]
    [TD]Smallville[/TD]
    [TD]100[/TD]
    [TD]10[/TD]
    [TD]Filippo[/TD]
    [/TR]
    [/TABLE]

    E in output vorrei avere questa:
    [TABLE="class: grid, width: 500"]

    [TD]id[/TD]
    [TD]idCitta[/TD]
    [TD]nomeCitta[/TD]
    [TD]abitantiCitta[/TD]
    [TD]idUtente[/TD]
    [TD]nomeUtente[/TD]
    [TD]abitantiUtente[/TD]
    [/TR]

    [TD]1[/TD]
    [TD]1200[/TD]
    [TD]Metropolis[/TD]
    [TD]200[/TD]
    [TD]10[/TD]
    [TD]Filippo[/TD]
    [TD]300[/TD]
    [/TR]

    [TD]2[/TD]
    [TD]1300[/TD]
    [TD]Roma[/TD]
    [TD]120[/TD]
    [TD]19[/TD]
    [TD]Giovanni[/TD]
    [TD]207[/TD]
    [/TR]

    [TD]3[/TD]
    [TD]1400[/TD]
    [TD]Lugano[/TD]
    [TD]87[/TD]
    [TD]19[/TD]
    [TD]Giovanni[/TD]
    [TD]207[/TD]
    [/TR]

    [TD]4[/TD]
    [TD]1500[/TD]
    [TD]Smallville[/TD]
    [TD]100[/TD]
    [TD]10[/TD]
    [TD]Filippo[/TD]
    [TD]300[/TD]
    [/TR]
    [/TABLE]

    Grazie per le risposte.


  • Moderatore

    Ciao, con una semplice group by puoi ricavare la somma degli abitanti per ogni idUtente, con un altra query recuperi la lista dei campi che ti servono, dopodichè crei la stringa di output in formato HTML (ho ipotizzato che il dato debba essere visualizzato su una pagina web).
    Trovi la sintassi sul sito w3cschools.

    Marco Puccetti


  • User

    Ciao e grazie per la risposta.
    Quello che hai appena scritto io lo faccio già, cioè recuperarmi la somma degli abitanti delle città con group by idUtente e mandarla in output a parte (quindi con due SELECT diverse)
    Quello che vorrei è eliminare la select che calcola gli abitantiUtente e accorparla a quella principale (che prende tutti i record della tabella).
    Diciamo che ho pensato ad una soluzione, che ovviamente non funziona, magari potreste darmi un mano a sistemarla

    
    SELECT *, (
    SELECT SUM(table.abitantiCitta)
    FROM table
    GROUP BY idUtente
    ) AS abitantiUtente
    FROM table
    
    

    Ovviamente questa query non funziona....


  • Moderatore

    Ciao, prova ad utilizzare gli alias come ho riportato di seguito.
    In questo modo non dovrebbe servire neppure il raggruppamento.
    Per l'ordinamento fai come meglio desideri.
    Considera che adesso non posso provarla, per cui dammi un riscontro sull'esito del test.

    **SELECT T1.id, T1.idCitta, **** T1.****nomeCitta, **** T1.****abitantiCitta, **** T1.****idUtente, **** T1.**nomeUtente,
    (
    SELECT SUM(abitantiCitta) as abitantiUtente FROM TABELLA T2 WHERE T2.idUtente = T1.IdUser
    )
    FROM TABLE T1
    )

    Marco Puccetti


  • User

    Considera che io ho una sola tabella, quindi ho modificato quello che hai scritto considerando in entrambe le select la tabella T1.
    Il risultato è che in ouput nella nuova colonna mi somma tutti gli abitanti di ogni citta della tabella (non solo quelli corrispondenti ad ogni idUtente).
    Mi sfugge qualcosa, ma non capisco cosa..


  • Moderatore

    Prova così:

    **SELECT DISTINCT T1.id, T1.idCitta, **T1.**nomeCitta, **T1.**abitantiCitta, **T1.**idUtente, **T1.**nomeUtente,
    (
    SELECT SUM(abitantiCitta) as abitantiUtente FROM TABELLA T2 WHERE ****T2.idUtente = T1.idUtente
    )
    FROM ************************************TABELLA ************************************T1
    ORDER BY T1.idUtente
    )

    L'alias nella sotto-select dovrebbe garantirti che ad ogni passo venga eseguita la somma solo sugli *********************idUtente *********************espressi nella condizione T2.idUtente = T1.idUtente.

    Praticamente con l'alias utilizzi una tabella in due contesti differenti (gli alias sono T1 e T2).

    Provala e fammi sapere
    Marco******************


  • User

    Perfetto! Funziona alla grande! Non avevo letto bene il post precedente, mea culpa...
    Ecco, diciamo che quei risultati non mi serve averli in output, la sottoquery è un condizione della query principale e mi serviva ottenere quel risultato....comunque, avremo modo di parlarne, ho da ottimizzare un paio di query e se non riesco a risolvere apro un altro post.
    Grazie mille 😉


  • Moderatore

    Bene, in ogni caso, sono sempre disponibile ad aiutarti per qualsiasi problema.

    Marco