Newsgroup: it.comp.www.php
Titolo: cancellare records in tabelle  in relazione 1 a 1

Ciao a tutti
non riesco ad ottenere nessun aiuto dal NG di mysql e pertanto posto qui che 
ci sono esperti che la sanno più lunga di loro
non riesco a mettere a punto una query che mi permetta di cancellare tout 
court
contemporaneamente un record da due tabelle distinte poste in relazione fra
di loro.
Le due tabelle hanno un campo uguale
Nella prima è chiamato id menre nella seconda è chiamato cli_id ma il
contenuto è lo stesso e mi serve per metterle in relazione.
Come devo impoostare la query per cancellare i due record (uno per tabella)
sapendo che la where si deve basare sul fatto che il campo stato deve
essere=0 e il campo iscrizione deve essere maggiore alla data di ieri 
(ovvero >24
ore?)
Grazie

 di loro.
Non puoi.
O fai due query (eventualmente con una transazione, se usi InnoDB) oppure 
fai un trigger sul server che cancella la seconda riga quando la prima 
viene cancellata.
Bye.

 Bye.
Ho capito ed è abbastanza facile farlo se ci fosse una sola tabella da cui 
cancellare
Ma il problema è che possono essere molti o anche noltrissimi i records da 
cancellare
quindi se con la prima query cancello i records vecchi di 1 giorno dalla 
prima tabella IN CUI HO I CAMPI STATO E DATA che mi dicono se devo 
cancellarli o non, nella seconda tabella ho solo l'id che lo leggo dalla 
prima o che serviva per mettere in relazione le tabelle
QUINDI come faccio dopo la cancellazione dei record dalla prima tabella a 
cancellare i record della SECONDA?
Bisogna quindi che li cancelli uno a uno e che ad ogni cancellazione mi 
ritorni l'id del recod cancellato per cancellare il record omonimo della 
seconda tabella il tutto in un loop per avere la sicurezza di cancellarli 
tutti.
Cosa mi consigli di fare??

 Cosa mi consigli di fare??
begin transaction, select dalla prima, prendi gli id e cancelli dalla 
seconda, cancelli dalla prima, end transaction.
Bye.

 Grazie
Prego, non ho testato niente quindi nego tutto :P

> Le due tabelle hanno un campo uguale
usa innoDB engine
con phpmyadmin entra in relazioni
e imposta l'integrità referenziale con delete=cascade update=cascade
quando cancelli il record della tabella padre automaticamente ti
cancella i record figli, senza bisogno di alcun delete sulla tab figlio in
quanto è l'engine che si occupa di mantenre l'integrità ref. ed evitare
record orfani.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

$time=time();
DELETE table1, table2 FROM table1 as p INNER JOIN table2 as c ON cli_id=id 
WHERE p.stato=0 AND p.registrato-$time>86400
DELETE table1, table2 FROM table1 AS p INNER JOIN table2 AS c WHERE 
cli_id=id AND stato=0 AND p.registrato-$time>86400

prima o che serviva per mettere in relazione le tabelle
Dopo che hai ammazzato i record nella prima tabella, i record orfani della
seconda tabella li puoi trovare con una LEFT JOIN (e, nel frattempo, se le
join sono fatte ammodo, nessun altro li trovera' comunque).
Leonardo SE&O
-- 
IN NO EVENT SHALL MICROSOFT [] BE LIABLE FOR [] FAILURE TO MEET ANY DUTY
INCLUDING OF GOOD FAITH OR OF REASONABLE CARE, FOR NEGLIGENCE [] EVEN IN
THE EVENT OF [] BREACH OF CONTRACT OR BREACH OF WARRANTY OF MICROSOFT...
                              -- EULA di Windows Media VCM 9, articolo 8


Questo tuo post cosa significa?
Forse se avessi aggiunto un commentino...
Cmq a prima vista sono entrambe sbagliate: se usi gli alias (come viene
suggerito dalla guida poco sopra qui
http://dev.mysql.com/doc/refman/5.0/en/delete.html#docnav
)
devi mettere quelli dopo DELETE 

 devi mettere quelli dopo DELETE
hai ragione
sdto provando se funziona cosě :
$time=time();
$query="DELETE pw, clnt FROM pw INNER JOIN clnt WHERE 
pw.id
=clnt.cli_id AND 
pw.stato=0 AND pw.iscrizione-$time>86400";
con gli alias non funzionava

 con gli alias non funzionava
con gli alias funziona se li metti nei posti giusti hai visto il link che
ti ho dato?
In fine se e quando risolverai, ricordati che č buona norma che tu lo dica
e che dica come... i motivi sono molteplici e per questo non ho voglia di
enumerarli :P

 enumerarli :P
OK 

Allora:
$time=time();
$query="DELETE pw, clnt FROM pw INNER JOIN clnt WHERE 
pw.id
=clnt.cli_id AND
pw.stato=0 AND pw.iscrizione-$time>86400";
Funziona egregiamente e cancella tutti i records da entrambe le tabelle il 
cui stato sia 0 dopo le 24 ore dalla loro creazione
Mi sarebbe piaciuto di più usare gli alias ma evidentemente sbaglio ancora a 
dichiararli
Mi chiedo però se con delete devo usare lock e unlock e come
Grazie