• User Attivo

    Mysql - Problema Viste

    Ciao a tutti, sto cercando di creare una vista di statistiche per il mio database.

    le tabelle sono strutturate in questo modo

    
    nazione:
    ---------------
    |nome | denaro | 
    |        |           |
    |        |           | 
    
    
    Citta:
    -----------------------------------
    |nome | denaro | abitanti | nome_nazione |
    |        |           |            |                     |
    |        |           |            |                     |
    
    
    
    esercito:
    -----------------------------------
    |nome | denaro | soldati | nome_nazione |
    |        |           |           |                    |
    |        |           |           |                    |
    
    
    ```Ovviamente le nazioni sono in relazione con gli attributi "nazione_nome"
    
    Vorrei creare una vista di statistiche che mi permetta di:
    
    
    *  visualizzare il numero totale di città di ogni nazione,
    *  la somma del denaro di ogni nazione + il denaro degli eserciti corrispondenti e di tutte le città della nazione
    *  contare gli eserciti di ogni nazione
    * sommare i soldati di tutti gli eserciti di ogni nazione con gli abitanti di tutte le città di ogni nazione.
    
    In pratica vorrei ottnere una vista di questo tipo: 
    
    

    vista:

    |nazione| n° di città | denaro totale | n° di eserciti | abitanti+soldati |
    | | | | | |
    | | | | | |

    CREATE VIEW Statistiche
    AS select nazione.nome, count(citta.nome), sum(citta.soldi)+sum(esercito.soldi)+nazione.soldi, count(esercito.nome), sum(citta.abitanti)+sum(esercito.soldati)
    from nazione,citta,esercito
    where nazione.nome=citta.nazione_nome and nazione.nome=esercito.nazione_nome
    group by nazione.nome

    Se invece creo singolarmente una vista per ogni parametro, questo funziona.
    Per es:
    

    VIEW Statistiche
    AS select nazione.nome, count(citta.nome),
    from nazione,citta
    where nazione.nome=citta.nazione_nome
    group by nazione.nome

    
    Spero che qualcuno abbia voglia di aiutarmi.
    Grazie in anticipo

  • User Attivo

    Up

    Nessuno disponibile? 😞


  • User Attivo

    Ciao,
    purtroppo quando aggreghi più tabelle i dati sono moltiplicati e nel caso di COUNT e SUM questo si riperquote sul valore finale.

    Una soluzione è quella di usare query annidate o tabelle temporanee, ma qui non è applicabile poichè non è possibile utilizzare nè le une n'è le altre quando si crea una vista.

    Nel tuo caso, con opportune premesse, una possibile soluzione potrebbe essere questa:

    
    CREATE VIEW Statistiche AS 
    SELECT 
    nazione.nome, 
    COUNT(DISTINCT citta.nome), 
    SUM(citta.denaro) / COUNT(DISTINCT citta.nome) + SUM(esercito.denaro) / COUNT(DISTINCT esercito.nome) + nazione.denaro, 
    COUNT(DISTINCT esercito.nome),
    SUM(citta.abitanti) / COUNT(DISTINCT citta.nome) + SUM(esercito.soldati) / COUNT(DISTINCT esercito.nome)
    FROM nazione
    LEFT JOIN citta ON nazione.nome = citta.nome_nazione
    LEFT JOIN esercito ON nazione.nome = esercito.nome_nazione
    GROUP BY nazione.nome
    
    

    Funziona (se non ho sbagliato a scrivere) se i campi 'nome' nelle tabelle citta e esercito sono unici.
    Nel caso non lo fossero potresti rimediare assegnando a ciascun record delle due tabelle in questione un id numerico con auto_increment ed utilizzare quello nella query per i conteggi.

    (Ho utilizzato i nomi dei campi che hai messo nella descrizione delle tabelle, perchè nelle query ne hai scritti altri e non sapevo quale fosse la versione corretta)

    Alessandro


  • User Attivo

    Grazie mille davvero!!!!!!
    Entro domani provo!

    Ps: scusa ,hai ragione, ero difretta e sovrapensiero ho utilizzato nome diversi per la descrizione e per le query. Grazie mille ancora.