Home / Database & Server / Database & Server / Trovare ed eliminare duplicati in MySQL
Mattepuffo

Trovare ed eliminare duplicati in MySQL

Trovare ed eliminare duplicati in MySQL

Articolo aggiornato il 31-05-2015

Il problema dei duplicato c'è sempre, soprattutto quando i db sono belli pieni di record e stanno li da anni.

Grazie a semplici operazioni però possiamo trovari i recod duplicati e cancellarli.

Ovviamente prima di cancellare dei record solo perchè doppi/tripli/ecc fate accertatevi che sia giusto e fate un bel backup.

Prima di tutto vediamo come trovare i record duplicati.

Collegatevi al vostro db ed eseguite una query del genere:

SELECT author_name, COUNT(*) as Num FROM book GROUP BY author_name HAVING Num > 1 ORDER BY Num DESC;
+-------------------------------+-----+
| author_name                   | Num |
+-------------------------------+-----+
| stephen king                  |  15 |
| christian jacq                |  13 |
| clive cussler                 |  10 |
| deitel - deitel               |   3 |
| clive cussler, paul kemprecos |   3 |
| tolkien                       |   3 |
| arthur c. clarke              |   2 |
| no autore                     |   2 |
| arthur schopenauer            |   2 |
| pirandello                    |   2 |
+-------------------------------+-----+

Questo è un esempio reale preso da un mio db.

Ho cercato quante volte lun autore fosse ripetuto (che in questo caso vuol anche dire quanti libri un autore ha scritto).

Come vedete ho usato la clausola HAVING, con la quale prendiamo solo quei valori che hanno un conteggio superiore a 1.

Se vogliamo cancellare tutti i duplicati tranne uno, possiamo anche usare un linguaggio lato server.

Allora vediamo un esempio:

include_once './Connessione.php';
$connessione = Connessione::getInstance();
$select = 'SELECT utente_email, count( * ) AS cnt FROM utenti
    GROUP BY utente_email HAVING cnt >1 ORDER BY cnt DESC';
$res = $connessione->execQuery($select);
foreach ($res as $key => $val) {
    echo $key . '->' . $val . '<br>';
    $numDel = $u['cnt'] - 1;
    $del = 'DELETE FROM utenti WHERE utente_email = ? LIMIT ' . $numDel;
    $connessione->execPrepare($del, array($u['utente_email']));
}

Il file Connessione.php è descritto in questo articolo (potete copiarlo così com'è).

Questo script è stato testato su un sito in produzione, e non mi ha dato problemi; voi dovete solo cambiare in nomi della tabella e dei campi e state a posto.

Enjoy!