Newsgroup: it.comp.lang.perl
Titolo: Mysql

Ciao a Tutti,
io ho due tabelle in mysql con la medesima struttura.
ora vorrei fare una query che mi trovi i record che hanno anche solo una
differenza o record aggiunti o record eliminati e che questi record trovati
vengano inseriti in una terza tabella sempre con la stessa struttura.
Come posso fare?
GRAZIE MILLE
Simone


wrote:

in Perl?
Perchè altrimenti hai sbaglaito ng :)
Quindi vuoi sapere come usare Perl e DBI per poter parsare i 2
database, analizzarne i record ricorsivamente e creare una terza
tabella con i record cambiati o nuovi?
--
I'm going home
http://www.pigmalion.info/

 tabella con i record cambiati o nuovi?
si, le tre tabelle sono identiche, nella prima vengono inseriti i dati e
quindi il primo record cioč la chiave č un contantore, poi viene in
automatico copiata sulla seconda e nella prima si continua a inserire i
dati.
Ora vorrei comparare le due tabelle naturalmente senza comparare la chiave
che č sicuramente diversa e inserire nella terza tabella le differenze.
Sono stato abbastanza chiaro?
Tutto questo utilizzando perl e dbi
Grazie
Simone

Tutto questo utilizzando perl e dbi
ma pur avendo le chiavi diverse i record occupano cmq la stessa
posizione nelle 2 tabelle?


 posizione nelle 2 tabelle?
no non è detto, teoricamente si ma non è certo...

no non è detto, teoricamente si ma non è certo...
ma infatti nel primo messaggio dici chiaramente 'dati aggiunti,
cancellati'....
cmq più che perl qua mi sembra un problema di database )
per quanto riguarda scovare i record aggiunti o rimossi, parsi una
tabella alla volta e analizzi ricorsivamente ogni record di una con i
record ell'altra e ti tiri fuori i nuovi record e quelli cancellati
per quanto riguarda quelli modifcati la vedo più dura
modificati in base a quale criterio
se prima era mele e diventa pere, con quale criterio dovrei assumere
che il record pere non è un nuovo record, ma la modifica di mele?
ti chiedo io a te? :))
cmq, just out of curiosity, hai dato uno sguardo alla doc di dbi?
io è parcchio che no la guardo... magari c'è qualcosa...


 io č parcchio che no la guardo... magari c'č qualcosa...
es:
Tabella 1
id    nome    campo1    campo2
1    simo      35            pluto
2    simo      99            pippo
3    simo      12            paperino
4    marco    88            minnie
Tabella 2
id    nome    campo1    campo2
9    simo      88            pluto
10    simo      99            pippo
11    simo      12            poldo
12    marco    1            qui
Tabella 3
1    simo       35    pluto
2    simo        12   paperino
4    marco      88   minnie
č chiaro l'esempio?

no non è detto, teoricamente si ma non è certo...
E qual è esattamente il criterio in base al quale decidi che due record
diversi sono uguali, e quindi diversi, o due record uguali sono diversi, e
quindi uguali? qual è lo stesso che è un altro e qual è l'altro che è lo
stesso?
Per sapere in che cosa due cose sono diventate diverse, bisognerà anche
capire se sono mai state uguali e perché, mi pare.
A meno che non ti basti la differenza fra le due tabelle, non a livello di
singolo record. In questo caso, immagino che Mysql abbia un suo modo di
comporre l'interrogazione, o si può costruire una funzione differenza,
analoga alla diff fra due file (al limite, metti tutto su due file di
testo, ed usi proprio diff). Questo richiede che ci sia, almeno, un
ordinamento significativo comune tra le due tabelle. Come in diff, poi, ci
saranno da decidere alcuni parametri (quanti record consecutivi devono
essere uguali per decidere che le due tabelle sono sincronizzate, quanti
diversi per decidere di dargliela su e concludere che è tutto diverso,
ecc.).
Ciao.


si adesso si
č piů semplice di come l'avevi messa tu
un criterio c'č.. č il campo 1
ora resta da stabilire che tipo di aiuto cerchi :)
in che logica analizzare i dati?
con quale codice di DBI estararre i dati?
o come confrontarli in perl?
saluti


č chiaro l'esempio?
Non tanto (anche se almeno suggerisce che ti interessa 2-1 e non 1-2). Se
fosse:
    Tabella 1
    id   nome     campo1    campo2
    1    simo      35       pluto
    2    gio       11       superman
    3    simo      99       pippo
    4    simo      12       paperino
    5    marco     88       minnie
    Tabella 2
    id    nome    campo1    campo2
    9     simo     88       pluto
    10    simo     99       pippo
    11    simo     12       poldo
    12    marco    1        qui
i due record
    3    simo      99       pippo
    10   simo      99       pippo
sono uguali, o i due record
    2    gio       11       superman
    10   simo      99       pippo
sono diversi?
Credo, comunque, che potrebbe interessarti Algothm::Diff. Almeno, la
lettura della documentazione.
Ciao.

 o come confrontarli in perl?
Allora, io ho dei file xml, con perl li leggo e inserisco i dati nel db
mysql, qundi ogni file identifica il nome.
dopo un'ora rileggo il file xml che può essere cambiato, copio la tabella
precedente in una uguale rinserisco i dati leggendoli dall xml e quindi devo
verificare le differenze.
Il campo sempre uguale sarà il nome e nella terza tabella devo mettere il
valore della prima solo nei record in cui è cambiato campo1 o campo2 o
entrambi.
Questo lo vorresi fare con perl non so dirti altro.
Esempio questo lo uso per copiare la tabella prima del nuovo reinserimento
#!/usr/bin/perl
#Preparazione collegamento db net
sub connection {
use DBI;
my $driver = shift;
my $database = shift;
my $hostname = shift;
my $port = shift;
my $user = shift;
my $password = shift;;
my $dsn =
"DBI:$driver:database=$database;host=$hostname;port=$port;user=$user;passwor
d=$password";
my $dbh = DBI->connect($dsn, $user, $password) || die "Connection failed:
$DBI::errstr!";
my $drh = DBI->install_driver($driver);
print "Connessione con DB net RIUSCITA\n\n";
return $dbh, $drh;
}
($dbh, $drh) = connection('mysql','net','','','root','1234');
$dbh->do("DELETE FROM net.Software_old");
$dbh->do("INSERT INTO net.Software_old SELECT * FROM net.Software");
$dbh->disconnect;
exit;
Grazie

     10   simo      99       pippo
l'ordine di come sono inseriti půo variare.
Grazie

sono uguali
E se hai:
    Tabella 1
    id   nome     campo1    campo2
    1    simo      35       pluto
    3    simo      99       pluto
    4    simo      10       pippo
    5    simo      12       paperino
    6    marco     88       minnie
    Tabella 2
    id    nome    campo1    campo2
    9     simo     88       pluto
    10    simo     99       pippo
    11    simo     12       poldo
    12    marco    1        qui
E'
    3    simo      99       pluto
che è diventato
    10    simo     99       pippo
o
    4    simo      10       pippo
che è diventato
    10    simo     99       pippo
o ti basta dire che tutt'e due sono diversi (da cosa?)?
Dal tuo esempio, la query (dialetto Access, ma la traduzione dovrebbe
essere immediata):
SELECT Tabella1.*
FROM Tabella1 INNER JOIN Tabella2 ON (Tabella1.nome = Tabella2.nome) AND
(Tabella1.campo2 = Tabella2.campo2)
WHERE (((Tabella1.campo1)<>[tabella2].[campo1]));
è sufficiente per estrarre:
    1    simo       35    pluto
e la query:
SELECT Tabella1.*
FROM Tabella1 INNER JOIN Tabella2 ON (Tabella1.campo1 = Tabella2.campo1)
AND (Tabella1.nome = Tabella2.nome)
WHERE (((Tabella1.campo2)<>[tabella2].[campo2]));
è sufficiente per estrarre:
   4    simo       12    paperino
Più difficile estrarre (solo)
   4    marco      88    minnie
perché anche, per esempio  
   1    simo       35    pluto
è diverso da
   10   simo       99    pippo
Immagino che ci voglia una SELECT nidificata, e un operatore che consenta
di definire l'appartenenza ad un insieme (IN?). E un criterio per stabilire
l'insieme.
Mi verrebbe in mente qualcosa come:
SELECT DISTINCTROW Tabella1.*
FROM Tabella1 INNER JOIN Tabella2 ON Tabella1.nome = Tabella2.nome
WHERE (((Tabella1.campo1) Not In (select tabella2.campo1 from tabella2
where tabella2.nome = tabella1.nome)));
che però ancora non basta. O un modo per marcare i record già analizzati, o
di eliminare a posteriori i doppioni.
Questo ragionando in SQL, ma non cambia, anche lavorando in perl si tratta
di stabilire un criterio; le SELECT danno un'idea di quello che si deve
fare.
Ciao.