- Home
- Categorie
- Coding e Sistemistica
- MYSQL e altri Database
- Mysql - Problema Viste
-
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.nomeSe 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.nomeSpero che qualcuno abbia voglia di aiutarmi. Grazie in anticipo
-
Up
Nessuno disponibile?
-
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
-
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.