Importare dati da più tabelle

Gli argomenti di questa pagina

  • Prima di iniziare
  • Importare dati da più tabelle
  • Progettazione della tabella
  • Creazione della tabella
  • Importare dati da più tabelle

Prima di iniziare

Qui di seguito quel che ci occorre per eseguire Le Query presentate in questa pagina.

Innanzitutto verificare che esista il file che contiene i dati di connessione al DB.
In questo file verranno indicate le sole quattro variabili necessarie a stabilire la connessione al DB prima di compiere qualsiasi azione ed è questo file che includeremo in tutte le pagine che debbono lavorare col DB. Questi dati vengono forniti dall'host che abbiamo scelto per il nostro sito.

Il file db_login.php
1
2
3
4
5
6
<?php
$Host 
"hostname";
$User "username";
$Password "password";
$DBName "DBName";
?>

Questo che segue è un frammento di codice che sarà necesario per eseguire la connessione al DB ed alla esecuzione delle Query.

Questo frammento di codice va inserito nella pagina che deve eseguire operazioni col DB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
include ('res/db_login.php');
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error() . "<br />\n";
} else {
    if (!
mysql_select_db($DBName)) {
        echo 
mysql_error() . "<br />\n";
    } else {
        
mysql_set_charset("utf8"); 
        
//    esecuzione della Query
        
$result mysql_query($Query);
        if (!
$result) {
            echo 
mysql_error() . "<br />\n";
        } else {
            echo 
"Query eseguita<br />\n";
            
//    qui vengono eseguiti altri eventuali lavori
        
}
    }
}
@
mysql_close ($Link);
?>

Se si apre una connessione a MySQL all'interno del file PHP è possibile chiuderla con la funzione mysql_close(). Anche se non tutti i programmatori usano chiudere esplicitamente la connessione perchè lo trovano inutile, in quanto le connessioni MySQL sono solitamente chiuse per default alla fine dello script, è buona norma fare in modo che tutte le risorse vengano liberate dopo l'utilizzo del DB, usando la funzione mysql_close(). Ciò assicurerà che la connessione venga chiusa nella linea esatta nello script in cui si dice di chiudere.

Chiusura della connessione al DB
1
2
3
<?php
mysql_close 
($link);
?> 

Importare dati da più tabelle

Dopo aver visto come duplicare e popolare una tabella partendo da una tabella esistente, potrebbe presentarsi la necessità di compiere una operazione più complessa: importare in una nuova tabella i dati prelevati da due o più tabelle.
Intanto la struttura della tabella che dovrà essere popolata dati dati prelevati da due o più tabelle dovrà essere creata manualmente come spiegato nelle precedenti pagine. Poi si potrà pensare al metodo da usare per popolarla.
Il discorso è sempre lo stesso: se i dati sono pochi (ma alle volte anche inserire meno di dieci record può essere problematico) possiamo farlo anche manualmente. Ma se i record da inserire sono nell'ordine di alcune centinaia o migliaia, vale la pena usare metodi alternativi e scrivere un po' di codice.

Prendiamo come esempio la tabella sql_rubrica_nuova usata in questa pagina come esempio. Abbiamo creato questa tabella copiando struttura e dati dalla tabella sql_rubrica.
Ma consideriamo l'ipotesi di dover importare dati da altre tabelle come in questo esempio:

Vediamo ora un altro esempio. abbiamo due tabelle:
la Tabella sql_comuni
la Tabella sql_province
che hanno questi campi:

Per la tabella sql_comuni
id, id_provincia, cap, comune

Per la tabella sql_province
id, provincia, Sigla_provincia

Progettazione della tabella

Il problema è ora come trasferire i dati prelevandoli dalle due tabelle presentate qui di seguito e viene complicato anche dal fatto che le tabelle hanno un numero diverso di record.

La tabella sql_comuni ha 14701 record trovati
record
La tabella sql_province ha 110 record trovati
record

Vediamo come possiamo comportarci.
Intanto dobbiamo creare la tabella sql_comuni_full usando una delle tecniche usate nella pagina "Creazione di una tabella".

Ma osserviamo alcune righe delle due tabella da cui prelevare i dati e, soprattutto, i campi presenti nelle due tabelle in questione:

Per la tabella comuni (14701 record)
15 record visualizzati
id id_provincia cap comune
1 98 35031 Abano terme bagni
2 16 84040 Abatemarco
3 1 67030 Abazia di sulmona
4 61 10060 Abbadia alpina
5 44 26834 Abbadia cerreto
6 91 53040 Abbadia di montepulciano
7 53 61041 Abbadia di naro
8 43 23821 Abbadia lariana
9 91 53021 Abbadia san salvatore
10 71 09071 Abbasanta
11 3 65020 Abbateggio
12 23 48012 Abbatesse
13 56 15024 Abbazia
14 31 04010 Abbazia di fossanova
15 49 21049 Abbiate guazzone
Per la tabella sql_province (110 record)
15 record visualizzati
id provincia Sigla_provincia
1 Aquila AQ
2 Chieti CH
3 Pescara PE
4 Teramo TE
5 Matera MT
6 Potenza PZ
7 Catanzaro CZ
8 Cosenza CS
9 Crotone KR
10 Reggio Calabria RC
11 Vibo Valentia VV
12 Avellino AV
13 Benevento BN
14 Caserta CE
15 Napoli NA

Vogliamo creare una tabella sql_comuni_full. Dallo studio delle due tabelle decidiamo che la nuova tabella dovrà i campi indicati qui di seguito.
Quindi possiamo passare alla sua creazione in modo da unire le due tabelle di cui sopra ed ottenere questa struttura:

Per la tabella sql_comuni_full questi sono i campi da utilizzare
id, cap, comune, provincia, Sigla_provincia

Creazione della tabella

Purtroppo, per riuscire nell'intento, non è possibile creare la terza tabella coi metodi visti Nella pagina precedente ma occorre creare la struttura della terza tabella manualmente o tramite un file sql simile a quello visibile qui sotto.
Per il trasferimento dei dati la cosa è relativamente più semplice e verrà mostrato più sotto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-- phpMyAdmin SQL Dump
-- version 2.10.3
-- http://www.phpmyadmin.net
-- 
-- Host: localhost
-- Generato il: 05 Nov, 2013 at 05:07 PM
-- Versione MySQL: 5.0.51
-- Versione PHP: 5.2.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

-- 
-- Database: `my_DB`
-- 

-- --------------------------------------------------------

-- 
-- Struttura della tabella `sql_comuni_full`
-- 

DROP TABLE IF EXISTS `sql_comuni_full`;
CREATE TABLE IF NOT EXISTS `sql_comuni_full` (
  `id` int(10) NOT NULL auto_increment,
  `cap` varchar(10) NOT NULL,
  `comune` varchar(150) NOT NULL,
  `provincia` varchar(150) default NULL,
  `Sigla_provincia` varchar(5) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Importare dati da più tabelle

Il metodo usato per l'importazione dei dati in una tabella l'abbiamo visto nella pagina precedente usando una Query INSERT con questa sintassi:

INSERT INTO tab_destinazione [(elenco campi)]
(SELECT elenco campi from tab_origine)

dove elenco campi indicato nella clausola INSERT è facoltativo se tutti i campi della tab_destinazione coincidono con tutti i campi della tab_origine

In questo caso, mentre rimane invariata la prima parte della Query, la SELECT della seconda parte della Query diventa più complessa perchè ha bisogno di una JOIN per collegare le due tabelle da cui occorre prelevare i dati.
Di questo tipo di select verrà parlato più avanti in questo settore.
Prima di pensare alla creazione della Query INSERT è buona norma verificare la Query SELECT. Se questa restitisce il resultset atteso siamo pronti alla creazione della Query INSERT includendo la Query SELECT come subquery. In caso contrario occorre controllare se la Query SELECT è esatta o se, addirittura, in una delle due tabelle da importare ci siano dei dati incongruenti.
Per ora basta osservare la sintassi usata nella SELECT qui sotto che verrà usata nella Query INSERT come subquery e vedere il resultset che è capace di produrre.

1
2
3
4
5
6
7
8
9
10
<?php
$Query 
"SELECT 
    sql_comuni.cap, 
    sql_comuni.comune, 
    sql_province.provincia, 
    sql_province.Sigla_provincia
    FROM sql_comuni
    INNER JOIN sql_province 
    ON sql_comuni.id_provincia = sql_province.id"
;
?>

La Query ha restituito 14701 record trovati
record
15 record visualizzati
cap comune provincia Sigla_provincia
35031 Abano terme bagni Padova PD
84040 Abatemarco Salerno SA
67030 Abazia di sulmona Aquila AQ
10060 Abbadia alpina Torino TO
26834 Abbadia cerreto Lodi LO
53040 Abbadia di montepulciano Siena SI
61041 Abbadia di naro Pesaro Urbino PU
23821 Abbadia lariana Lecco LC
53021 Abbadia san salvatore Siena SI
09071 Abbasanta Oristano OR
65020 Abbateggio Pescara PE
48012 Abbatesse Ravenna RA
15024 Abbazia Alessandria AL
04010 Abbazia di fossanova Latina LT
21049 Abbiate guazzone Varese VA

Osservendo il resultset restituito dalla Query SELECT possiamo dedurre che è quello atteso:
il numero di record restituiti sono congruenti con quelle dei comuni (14701) e gli abbinamenti comune - provincia risultano esatti.
Quindi siamo pronti per creare la Query INSERT che include la Query SELECT come subquery.

1
2
3
4
5
6
7
8
9
10
11
<?php
$Query 
"INSERT INTO sql_comuni_full (cap, comune, provincia, Sigla_provincia)
    (SELECT 
    sql_comuni.cap, 
    sql_comuni.comune, 
    sql_province.provincia, 
    sql_province.Sigla_provincia
    FROM sql_comuni
    INNER JOIN sql_province 
    ON sql_comuni.id_provincia = sql_province.id)"
;
?>

Fatto. Se ora leggiamo la tabella sql_comuni_full appena creata e popolata coi dati prelevati dalle due tabelle sql_comuni e sql_province ottenendo quel che è mostrato nella seguente tabella vuol dire che la Query ha funzionato.
Il numero di record ottenuti è congruente col numero di record della tabella sql_comuni e con quello restituito dalla Query SELECT di prova e gli abbinamenti comuni - provincie sono anch'essi congruenti.

1
2
3
4
<?php
$Query 
"SELECT *
FROM sql_comuni_full"
;
?>

La Query ha restituito 14701 record trovati
record
15 record visualizzati
id cap comune provincia Sigla_provincia
1 35031 Abano terme bagni Padova PD
2 84040 Abatemarco Salerno SA
3 67030 Abazia di sulmona Aquila AQ
4 10060 Abbadia alpina Torino TO
5 26834 Abbadia cerreto Lodi LO
6 53040 Abbadia di montepulciano Siena SI
7 61041 Abbadia di naro Pesaro Urbino PU
8 23821 Abbadia lariana Lecco LC
9 53021 Abbadia san salvatore Siena SI
10 09071 Abbasanta Oristano OR
11 65020 Abbateggio Pescara PE
12 48012 Abbatesse Ravenna RA
13 15024 Abbazia Alessandria AL
14 04010 Abbazia di fossanova Latina LT
15 21049 Abbiate guazzone Varese VA

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum