Ciao a tutti,
nel db ho circa 45.000 record e ci sono molti doppioni identici, mi aiutate a creare una query-script che mi consenta di eliminare automaticamente i doppioni lasciandone una solo capia...
grazie!
Ciao a tutti,
nel db ho circa 45.000 record e ci sono molti doppioni identici, mi aiutate a creare una query-script che mi consenta di eliminare automaticamente i doppioni lasciandone una solo capia...
grazie!
Una indicazione.. un'idea ....Originariamente inviato da dinucciarturo
Ciao a tutti,
nel db ho circa 45.000 record e ci sono molti doppioni identici, mi aiutate a creare una query-script che mi consenta di eliminare automaticamente i doppioni lasciandone una solo capia...
grazie!
SELECT campo_doppione, COUNT(*) as tot
FROM TABELLA
GROUP BY campo_doppione
Order by tot
estrai i dati....
WHILE($row = mysql_fetch_assoc($query) {
if($row['tot'] > 1) { $limit = $row['tot'] - 1;
DELETE FROM TABELLA WHERE campo_doppione = '$row[campo_doppione]' LIMIT $limit
}
}
e poi compatta la tabella:
OPTIMIZE TABLE tabella
In solido, se la conta dei record e' superiore a 1, setti il limit = a $tot - 1 (quello che deve restare). altrimenti passa al successivo.
Fallo prima su una copia della tabella. Oppure invece del DELETE fai un SELECT con gli stessi criteri del DELETE. Vedrai cosa effettivamente andrai a cancellare.
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
problemino...la prima select campo_doppione io a priori non lo so, si dovrebbe fare in modo che automaticamente inizia dal primo capo (con una sessione eventualmente si salva il nome ad esempio) e poi con un'altra query va a scansionare tutto il db, e se trova campi uguali li cancella...Originariamente inviato da piero.mac
Una indicazione.. un'idea ....
SELECT campo_doppione, COUNT(*) as tot
FROM TABELLA
GROUP BY campo_doppione
Order by tot
estrai i dati....
WHILE($row = mysql_fetch_assoc($query) {
if($row['tot'] > 1) { $limit = $row['tot'] - 1;
DELETE FROM TABELLA WHERE campo_doppione = '$row[campo_doppione]' LIMIT $limit
}
}
e poi compatta la tabella:
OPTIMIZE TABLE tabella
In solido, se la conta dei record e' superiore a 1, setti il limit = a $tot - 1 (quello che deve restare). altrimenti passa al successivo.
Fallo prima su una copia della tabella. Oppure invece del DELETE fai un SELECT con gli stessi criteri del DELETE. Vedrai cosa effettivamente andrai a cancellare.
ti ringrazio!! ciao
Se vuoi cancellare record doppi si presume che avrai i campi tutti uguali. Ma uno di questi deve essere piu' uguale, nel senso che si ripete solo nel gruppo dei doppioni e non in altri record.Originariamente inviato da dinucciarturo
problemino...la prima select campo_doppione io a priori non lo so, si dovrebbe fare in modo che automaticamente inizia dal primo capo (con una sessione eventualmente si salva il nome ad esempio) e poi con un'altra query va a scansionare tutto il db, e se trova campi uguali li cancella...
ti ringrazio!! ciao
Quello e' il campo che devi individuare. potrebbe anche essere la congiunzione di due o piu' campi. allora il campo_doppione sara' formato da un:
CONCAT(campo1,campo2,campo3)
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
Ciao,
in Mysql io di solito (per fortuna ultimamente mi capita di rado) faccio qualcosa del genere:
Prima di tutto un bel backup e poi
--tabella di parcheggio
CREATE TEMPORARY TABLE myTmp AS SELECT DISTINCT * FROM tabella_con_duplicati
--svuoto l'originale
TRUNCATE tabella_con_duplicati ;
--inserisco di nuovo i record, questa volta unici
INSERT INTO tabella_con_duplicati SELECT * FROM myTmp;
Se non vuoi eliminare i duplicati e basta, e invece devi aggiornare i dati di un duplicato aggiungendogli quelli di quello da eliminare, devi sudare un po' con sql
Con RDBMS diversi da Mysql le cose possono essere più semplici
per favore NIENTE PVT TECNICI da sconosciuti
ok...grazie! provo e vi faccio sapere!
io creerei una tabella "pulita" vuota in cui non sono ammessi i duplicati (basta utilizzare il comando unique per definire chiavi primarie su più attributi) dopodichè farei un ciclo che utlizzando il comando distinct legge la tabella "sporca" e riempie la tabella "pulita"...
tutto sta nel vedere se il ciclo non si interrompe quando provi a scrivere una riga già inserita (cioè quando provi a inserire un duplicato)!!!
..povero silvio, lui è sceso in campo..
e lo ha fatto per noi...comunisti...
Originariamente inviato da mauri@como
io creerei una tabella "pulita" vuota in cui non sono ammessi i duplicati (basta utilizzare il comando unique per definire chiavi primarie su più attributi) dopodichè farei un ciclo che utlizzando il comando distinct legge la tabella "sporca" e riempie la tabella "pulita"...
tutto sta nel vedere se il ciclo non si interrompe quando provi a scrivere una riga già inserita (cioè quando provi a inserire un duplicato)!!!
piero.mac ho implementato la tua soluzione, apparentemente sembra funzionare
...prima di fare il delete ho inserito un echo con alcuni valori sembrava funzinare, ma con il delete non elimina una mazza! riesci a capire dov'è che sbaglio??Codice PHP:
$query = "SELECT DISTINCT nome,citta,regione,tel, COUNT(*) AS tot FROM federal_hotel GROUP BY nome,citta,regione,tel ORDER BY tot";
$result = mysql_query($query);
$number = mysql_affected_rows();
$i=0;
echo "
Il numero dei risultati è $number"; //numero effettivo di campi senza doppioni
while($number > $i){
$i++;
$row = mysql_fetch_assoc($result);
while($row['tot']>1){
$limit=$row['tot']-1;
$query2="DELETE FROM federal_hotel WHERE nome='$row[nome]',citta='$row[citta]',regione='$row[regione]',tel='$row[tel]' LIMIT $limit";
mysql_query($query2);
$row['tot']=$row['tot']-1;
} // while
}
grazie!
Hai fatto un minestrone di tutto$query = "SELECT DISTINCT nome,citta,regione,tel, COUNT(*) AS tot FROM federal_hotel GROUP BY nome,citta,regione,tel ORDER BY tot";
Cosa c'è di complicato nella soluzione che ti ho indicato?
Nella tabella temporanea inserisci il risultato di
SELECT DISTINCT * FROM tabella_con_duplicati
se si tratta di duplicati perfetti
altrimenti
SELECT DISTINCT campo_chiave_duplicato FROM tabella_con_duplicati
se il duplicato riguarda solo un campo
per favore NIENTE PVT TECNICI da sconosciuti