MySQL : come unisco le due tabelle ?

venerdì 29 settembre 2006 - 01.28

falconet Profilo | Newbie

Salve, ho un problema che mi attanaglia da diversi giorni, dunque...ho il database MySQL italia con all'interno 2 tavole :
db_regioni con i seguenti campi :

CREATE TABLE `db_regioni` (
`idregione` int(11) NOT NULL default '0',
`istat` char(2) NOT NULL default '',
`zona` char(3) NOT NULL default '',
`sigla` char(3) NOT NULL default '',
`regione` varchar(50) NOT NULL default '',
`abitanti` varchar(100) NOT NULL default '',
`capoluogo` varchar(100) NOT NULL default '',
PRIMARY KEY (`idregione`)
) ENGINE=InnoDB

con all'interno la lista delle 20 regioni e il
db_comuni con i campi :

CREATE TABLE `db_comuni` (
`regione` int(2) NOT NULL default '0',
`provincia` int(4) NOT NULL default '0',
`idcomune` int(4) NOT NULL default '0',
`comune` varchar(200) NOT NULL default '',
`cap` varchar(5) NOT NULL default '',
`pref` varchar(5) NOT NULL default '',
`catasto` varchar(4) NOT NULL default '',
`istat` varchar(10) NOT NULL default '',
`maschi` int(10) NOT NULL default '0',
`femmine` int(10) NOT NULL default '0',
`famiglie` int(10) NOT NULL default '0',
`abitazioni` int(10) NOT NULL default '0',
`abitanti` varchar(100) NOT NULL default '',
`patrono` varchar(100) NOT NULL default '',
`adsl` char(2) default NULL,
PRIMARY KEY (`idcomune`)
) ENGINE=InnoDB

e all'interno la lista degli 8101 comuni italiani
(in formato sql cosi' potete testarlo in locale ;))

avendo bisogno di estrapolare i dati dalle 2 tabelle restituendomi la seguente tabella temporanea :
+------------+------+-----------+------------+-----------+--------------+
|idregione | zona | regione | nrComuni | Famiglie | Abitazioni |
+------------+------+-----------+------------+-----------+--------------+
13 CEN Abruzzo 305 455564 640209
17 MER Basilicata 131 212918 275599
18 MER Calabria 409 699220 1077764
15 MER Campania 551 1838826 2133346
8 SET Emilia Romagna 341 1638914 1930041
6 SET Friuli-Venezia Giulia 219 496327 593930
12 CEN Lazio 378 1937353 2316582
7 SET Liguria 235 706254 969215
3 SET Lombardia 1546 3595478 4038245
11 CEN Marche 246 545861 660662
14 MER Molise 136 118231 168965
1 SET Piemonte 1206 1779054 2168847
16 MER Puglia 258 1362198 1809632
20 CEN Sardegna 377 570845 764870
19 MER Sicilia 390 1739972 2449366
9 CEN Toscana 287 1377834 1618903
4 SET Trentino-Alto Adige 339 366158 482060
10 CEN Umbria 92 309609 358165
2 SET Valle D'Aosta 74 53237 99144
5 SET Veneto 581 1699235 1970328
+------------+------+-----------+----------+-------------+

ho creato la seguente query :

SELECT db_regioni.idregione, db_regioni.zona, db_regioni.regione, COUNT(db_comuni.regione) AS nrComuni, SUM( db_comuni.famiglie ) AS Famiglie, SUM( db_comuni.abitazioni ) AS Abitazioni FROM db_regioni INNER JOIN db_comuni ON ( db_comuni.regione = db_regioni.idregione ) GROUP BY db_regioni.idregione ORDER BY db_regioni.regione ASC

fin qui tutto ok, ora avendo bisogno di aggiungere altri dati alla tabella precedente ho creato un'altra query per test:

SELECT db_regioni.idregione, db_regioni.zona, db_regioni.regione, COUNT(db_comuni.regione) AS ComuniConAdsl, SUM(db_comuni.famiglie) AS FamiglieConAdsl, SUM(db_comuni.abitazioni) AS AbitazioniConAdsl FROM db_regioni INNER JOIN db_comuni ON ( db_comuni.regione = db_regioni.idregione ) WHERE db_comuni.adsl = 'SI' GROUP BY db_regioni.idregione ORDER BY db_regioni.regione ASC

e correttamente la tabella temporanea :
+------------+------+-----------+--------------------+---------------------+-----------------------+
|idregione | zona | regione | ComuniConAdsl | FamiglieConAdsl | AbitazioniConAdsl |
+------------+------+-----------+--------------------+---------------------+-----------------------+
18 MER Calabria 54 212581 325900
1 SET Piemonte 1 3430 3477
+------------+------+-----------+--------------------+---------------------+-----------------------+

il problema arriva ora, come UNISCO le 2 query in modo da ottenere una tabella del seguente formato ?
+------------+------+-----------+-------------+----------+-------------+---------------------+-------------------------+--------------------------------------------------------------
|idregione | zona | regione | nrComuni | Famiglie | Abitazioni | ComuniConAdsl |FamiglieConAdsl | AbitazioniConAdsl |
+------------+------+-----------+-------------+----------+-------------+---------------------+
|idregione | zona | regione | nrComuni | Famiglie | Abitazioni | ComuniConAdsl |FamiglieConAdsl | AbitazioniConAdsl |
13 CEN Abruzzo 305 455564 640209 0 0 0
17 MER Basilicata 131 212918 275599 0 0 0
18 MER Calabria 409 699220 1077764 54 212581 325900
15 MER Campania 551 1838826 2133346 0 0 0
8 SET Emilia Romagna 341 1638914 1930041 0 0 0
6 SET Friuli-Venezia Giulia 219 496327 593930 0 0 0
12 CEN Lazio 378 1937353 2316582 0 0 0
7 SET Liguria 235 706254 969215 0 0 0
3 SET Lombardia 1546 3595478 4038245 72 4500580 257840
11 CEN Marche 246 545861 660662 0 0 0
14 MER Molise 136 118231 168965 0 0 0
1 SET Piemonte 1206 1779054 2168847 1 3430 3477
16 MER Puglia 258 1362198 1809632 0 0 0
20 CEN Sardegna 377 570845 764870 0 0 0
19 MER Sicilia 390 1739972 2449366 0 0 0
9 CEN Toscana 287 1377834 1618903 0 0 0
4 SET Trentino-Alto Adige 339 366158 482060 0 0 0
10 CEN Umbria 92 309609 358165 0 0 0
2 SET Valle D'Aosta 74 53237 99144 0 0 0
5 SET Veneto 581 1699235 1970328 0 0 0

GRAZIE 1000 per i suggerimenti

lbenaglia Profilo | Guru

>Salve, ho un problema che mi attanaglia da diversi giorni, dunque...ho
>il database MySQL italia con all'interno 2 tavole :

Ciao falconet ,

premetto che non conosco MySQL
Io definirei due viste contenenti le due query e le metterei in JOIN sulla colonna idregione.

>GRAZIE 1000 per i suggerimenti
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

falconet Profilo | Newbie

inanzitutto grazie x la risposta :
se non chiedo troppo mi faresti un esempio ?
visto che quello che dici lo fatto ma joinando la seconda tabella con la prima sulla prima query pero' il risultato non e' stato quello attesoinfatti i conteggi mi risultano doppi 54x2=108 per la colonna AbitantiConAdsl (e non solo, anche tutte le altre colonne mi da la somma o il conteggio doppio), diversamente non saprei come joinare la seconda tabella alla prima, ho provato anche un'altra query :
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
pero' quest'ultima mi restituisce correttamente solo le colonne ComuniConAdsl e FamiglieConAdsl mentre Comuni assume il risultato di ComuniConAdsl e Famiglie mi restituisce lo stesso risultato di FamiglieConAdsl
e ne ho fatto a 10ine di prove con diverse query senza pero' trovare il risultato ricercato :°°

lbenaglia Profilo | Guru

>inanzitutto grazie x la risposta :
>se non chiedo troppo mi faresti un esempio ?

Posta alcune righe di prova per le due tabelle (INSERT INTO) ed il result set che vorresti ottenere in base a quei dati.

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

tudo75 Profilo | Newbie

dove hai recuperato le liste dei comuni e dei capoluoghi?

falconet Profilo | Newbie

conosci la cartina geografica ? ebbene li ho copiati da li visto che non trovavo nulla di completo in giro
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5