Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    [MySql] doppioni nel db...come eliminarli?

    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!

  2. #2

    Re: [MySql] doppioni nel db...come eliminarli?

    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!
    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.



    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3

    Re: Re: [MySql] doppioni nel db...come eliminarli?

    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.


    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

  4. #4

    Re: Re: Re: [MySql] doppioni nel db...come eliminarli?

    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
    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.

    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.

  5. #5
    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

  6. #6
    ok...grazie! provo e vi faccio sapere!


  7. #7
    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...

  8. #8
    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)!!!

  9. #9
    piero.mac ho implementato la tua soluzione, apparentemente sembra funzionare
    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

    ...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??

    grazie!

  10. #10
    $query = "SELECT DISTINCT nome,citta,regione,tel, COUNT(*) AS tot FROM federal_hotel GROUP BY nome,citta,regione,tel ORDER BY tot";
    Hai fatto un minestrone di tutto


    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.