Newsgroup: it.comp.www.php
Titolo: Estrazione valori da tre tabelle e riorganizzazione in una quarta

Salve,
premetto che sono un autodidatta.
Volevo un vostro parere sulla soluzione che ho trovato per sapere se valida 
o meno.
Ho 3 tabelle (Articoli, Disponibilità, Prezzo), tutte hanno una chiave 
primaria consistente nel codice. Non hanno lo stesso numero di record per il 
semplice motivo che nella tabella Prezzo non tutti i prodotti sono 
rappresentati.
Tramite una pagina php mi creo la quarta tabella listino:
"CREATE TABLE listino (
 Matricola varchar (11) not null,
 Articolo varchar (100),
 Descrizione text,
 Codice varchar (30),
 ProduttoreID varchar (15),
 Produttore varchar (50),
 Disponibilita int (5),
 Prezzo float (11,2),
 PRIMARY KEY (Matricola)
)"
Per prima cosa importo i dati dalla tabella Articoli:
-Entro nel db articoli faccio una query dei soli campi che mi interessano-
WHILE ($row = MYSQL_FETCH_ARRAY($RisultatoARTI))
{
 $passa01 = $row['Matricola'];
 $passa02 = $row['Articolo'];
 $passa03 = $row['Descrizione'];
 $passa04 = $row['Codice'];
 $passa05 = $row['ProduttoreID'];
 $passa06 = $row['Produttore'];
$InserimentoARTI = mysql_query
("INSERT INTO listino
 (Matricola, Articolo, Descrizione, Codice, ProduttoreID, Produttore)
 VALUES
 ('$passa01', '$passa02', '$passa03', '$passa04', '$passa05', '$passa06')");
}
Ora devo inserire per ogni record, e più precisamente nel campo 
disponibilita, la quantità in giacenza:
-Entro nel db listino (creato e popolato precedentemente) faccio una query 
dei soli campi che mi interessano (Matricola e disponibilita)-
WHILE ($row = MYSQL_FETCH_ARRAY($RisultatoDISPO))
{
 $Scambio = $row['Matricola'];
 $ValoreDISPO = FN_InserimentoDispo($Scambio);
 $InserimentoDISPO = mysql_query("UPDATE listino SET 
Disponibilita='$ValoreDISPO' WHERE Matricola='$Scambio'");
}
La funzione FN_InserimentoDispo($Scambio) mi rimanda il valore del campo 
giacenza nel db disponibilità estraendo il record (l'unico in quanto chiave 
primaria) con identica matricola.
Identica procedura per inserire nel campo prezzo del db listino (quello 
riepilogativo) estratti però dal db prezzi.
Con un insieme di 24.000 record in un minuto genera la tabella e la popola 
(il server è linux ospitato su aruba).
Facendo dei test a campione (30, 40 in diversi punti) ogni record ha sia la 
quantità che il prezzo esatti.
La domanda che ripropongo è questa: il codice ricavato leggendo qua e la e 
da me scritto va bene? è pericoloso specie nelle associazioni prezzo 
giacenza che potrebbero essere attribuiti a prodotti diversi da quelli 
indicati?
Il fatto test che i test eseguiti non abbiano evidenziato non mi lascia 
totalmente tranquillo.
Grazie
jdipik

 indicati?
Il procedimento, e il codice, sembrano corretti, ma per esserne sicuri
l'unico modo e` fare test.
Ma la domanda che volevo farti e`: perche` non hai usato una vista invece
di popolare una tabella apposta?
Bye.

 di popolare una tabella apposta?
o semplicemente una join

 Bye.
Mi associo ad Alessandro (con un paio di join dovresti risolvere il 
problema) [1]
Avere una quarta tabella è pericoloso: se nel frattempo hai scalato di 
un'unità la disponibilità? La tabella dovresti crearla ogni volta, in 
tal caso passa alle temporary table: la creazione è dipendente dalla 
connessione al db, e una volta chiusa la connessione, la tabella viene 
cancellata 
http://dev.mysql.com/doc/refman/5.0/en/create-table.html
[1] In mysql 4 non hai le viste ma il problema non si pone: genererai la 
query tutte le volte
[1-a] Non mi ricordo dove, ma avevo letto che le viste di mysql5 non 
sono ottimizzate ma sono solo delle "query" salvate su db (come access, 
per intendersi); mi confermate/smentite questa voce?
	Francesco

Grazie delle risposte, il perchè non ho usato "vista" o "join" è presto 
scritto: non so cosa siano! :)
Sto apprendendo php e l'utilizzo dei database mentre assemblo questo 
progetto (non sono capace di imparare in altri modi) quindi l'utilizzo di 
"update" è stato determinato da una ricerca fatta al volo sulle potenzialita 
del comando "insert" non riuscendo a "sottometterlo" al mio bisogno, 
cercando cercando ho trovato "update".
Ora mi studio il comando "join" e vedo cose ne tiro fuori, da quello che ho 
capito usare le "viste" potrebbe portare dei problemi quindi evito.
Francesco F ti ringrazio particolarmente per avermi dato anche una 
delucidazione teorica sull'utilizzo pericoloso di una quarta tabella, perchè 
anche se nel mio caso i tre database (Articoli, Disponibilità, Prezzi) 
possono essere aggiornati solo una volta al giorno quindi il rischio per i 
motivi da te dichiarati non dovrebbe esistere, non è detto che in futuro non 
potrò avere una gestione dinamica delle quantità o di altre informazioni. 
Visto che ci sto mettendo le mani tanto vale che cominci già da ora ad 
affrontare il problema.
Anche perchè oggi che ho staccato la spina fisicamente, mentalmente sono 
riuscito a capire come (per le operazioni che non riuscivo a fare con i dati 
separati in tre tabelle) potrei fare a meno di questa quarta tabella. Almeno 
così potro meglio rendermi conto se realmente ne ho necessità e non 
considerarla una scelta obbligata.
Concludo ringraziandovi nuovamente.
JdiPik

 ho capito usare le "viste" potrebbe portare dei problemi quindi evito.
Beh, per fare una vista ti servira` conoscere le join, quindi procedi in
questo ordine per studiarle.
Una vista e` semplicemente una tabella virtuale accessibile in sola
lettura.
Si crea definendo una select (di solito con delle join, ma non
obbligatoriamente) che viene eseguita automaticamente quando accedi alla
vista
Se usi raramente il listino, ti conviene fare una join. Se lo usi spesso
ti conviene prendere la join e trasformarla in vista, perche` il server DB
internamente la precompila e pre-ottimizza, quindi hai meno latenza quando
estrai i dati.
Non mi ricordavo che in MySQL <5 non esistessero le viste. Le ho usate
solo con Postgres... :)
Bye.