Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,747

    [MySQL] trovare record duplicati

    Supponiamo che ho una tabella con questi valori

    id - nome
    1 carlo
    2 paolo
    3 marco
    4 carlo
    5 carlo
    6 matteo
    7 paolo


    mi servirebbe visualizzare i nomi duplicati e quindi ottenere questo risultato

    1 carlo
    4 carlo
    5 carlo
    2 paolo
    7 paolo

    Sto provando con
    codice:
    SELECT id,nome
    FROM tabella
    GROUP BY nome 
    HAVING (COUNT(nome) > 1) 
    ORDER BY nome ASC
    ma non funziona

    come si può risolvere?
    Errare humanum est, perseverare ovest

  2. #2
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,747
    in effetti non è che non funziona, la query fa il suo lavoro nel senso che mi indica i records che sono duplicati, ed il risultato è tipo

    carlo
    paolo

    purtroppo non è quello che mi serve
    Errare humanum est, perseverare ovest

  3. #3
    ti manca un passettino

    codice:
    SELECT id, nome FROM tabella WHERE ID IN 
    
    (
    
    SELECT id
    FROM tabella
    GROUP BY nome 
    HAVING (COUNT(nome) > 1) 
    
    ) 
    
    ORDER BY nome ASC
    potresti anche fare una self-join, vedi tu

  4. #4
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,747
    Grazie, la sto provando.

    Ma è possibile che per poco più di duemila records ci metta un minuto abbondante?
    Errare humanum est, perseverare ovest

  5. #5
    Originariamente inviato da carlo2002
    Grazie, la sto provando.

    Ma è possibile che per poco più di duemila records ci metta un minuto abbondante?
    se cerchi i record duplicati per cancellarli forse ti conviene creare una nuova tabella con la selezione tramite group by, drop tabella dublicati e poi rinomina tabella nuova.

    Otterresti una tabella linda, pulita e ottimizzata.

    Sempre che tu non abbia legami di vincoli referenziali. Li avresti comunque se devi scegliere quali record eliminare.

    Per il tempo prova ad indicizzare la colonna nome per velocizzare la subquery. Prova anche ad eseguire le due query separatamente tanto per curiosare sulla tempistica.

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

  6. #6
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,747
    Si, sono da eliminare i duplicati ma a manina solo dopo una scelta oculata di quali, non ci sono vincoli referenziali.

    Alla fine ho risolto con tre query

    - Con la prima vedo quali sono i duplicati.

    - Con la seconda ne ottengo gli id.

    - Con la terza visualizzo il risultato.

    Sarà un po' macchinoso ma funziona.

    0.002 secondi trovando 591 duplicati su 2.274 records da 17 campi ognuno.
    su un portatile con CPU Intel Core 2 DUO P8600 2.4 GHz

    Grazie
    Errare humanum est, perseverare ovest

  7. #7
    ----------------------------------------------------
    nello spirito del forum, spiega come hai fatto (postando la soluzione), così aiuterai qualche altro forumista che dovesse avere lo stesso problema.
    ------------------------------------------------------------------------

  8. #8
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,747
    Hai ragione.

    Allora la situazione è questa: mi ritrovo un db con una tabella dedicata a memorizzare indirizzi email per un servizio di newsletter. Per motivi vari può capitare che ci siano degli indirizzi duplicati, si lo so che questo andrebbe evitato con altri sistemi però questo è un caso particolare in cui, per una raffinata strategia aziendale, deve essere lasciato capitare per poi eventualmente andare a sistemare le cose a manina.

    Quindi l'esigenza era di inserire in un gestionale la possibilità di visualizzare tutti gli indirizzi duplicati per poi decidere quale togliere e quale lasciare.

    Di solito mi piace raggiungere delle soluzioni con un'unica query ma, siccome non sono una cima, qualche volta come in questo caso la faccenda incomincia a crearmi confusione e quindi preferisco scomporre il problema in parti più piccole.

    Per l'esempio basta una visione semplificata della tabella "iscrizioni_newsletter" con dei campi tipo

    - id_iscrizione
    - indirizzo_email
    - nome_cognome
    ...
    ...

    io per esigenze particolari ho dovuto risolvere con tre query ma effettivamente ne bastano due

    Per prima cosa estraggo gli indirizzi email duplicati, e li inserisco in un array

    Codice PHP:
    $result_email_duplicate mysql_query("
    SELECT indirizzo_email, COUNT(indirizzo_email) as duplicati
    FROM iscrizioni_newsletter
    GROUP BY indirizzo_email
    HAVING duplicati > 1
    "
    )  ;

    while ( 
    $dati_email_duplicate mysql_fetch_array($result_email_duplicate) ) { 
    $array_indirizzi_duplicati[] = "'".$dati_email_duplicate['indirizzo_email']."'" 


    Poi l'array ottenuto lo utilizzo per trovare i dati di tutti gli indirizzi duplicati
    Codice PHP:
    $result mysql_query("
    SELECT *
    FROM iscrizioni_newsletter
    WHERE indirizzo_email IN ("
    .implode(',',$array_indirizzi_duplicati).")
    ORDER BY indirizzo_email
    "
    )  ; 
    Occhio che se non ci sono duplicati e l'array rimane vuoto la query dà errore, quindi prima di eseguire la seconda query è meglio verificare.
    Errare humanum est, perseverare ovest

  9. #9
    permettimi un paio di suggerimenti:

    usa l'id che sara' sicuramente numerico e non un varchar da mettere nell'IN()

    Se non ci sono risultati basterebbe controllare prima del while con mysql_num_rows() e se il risultato e' zero schippare direttamente la seconda query senza ricevere errori. Metti la segnalazione di nessun duplicato.

    if(mysql_num_rows(della tua_result_set) == 0) {
    echo "non c'e' ciccia per i gatti";
    exit();
    } else { while...

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

  10. #10
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,747
    Originariamente inviato da piero.mac
    permettimi un paio di suggerimenti:
    Ma certo Piero, sempre ben accolti

    usa l'id che sara' sicuramente numerico e non un varchar da mettere nell'IN()
    Ma allora servirebbe una query in più per stabilire quali sono tutti gli id corrispondenti a tutti gli indirizzi duplicati.

    Perchè la prima SELECT mi dà solo i records duplicati raggruppati, ogni indirizzo email compare singolarmente e quindi non mi fornisce l'id di tutti i suoi duplicati.

    In verità nel mio script ho proprio fatto così con tre query perchè mi serve l'elenco degli id anche per altri motivi, qua volevo mettere una versione semplificata.


    Se non ci sono risultati basterebbe controllare prima del while con mysql_num_rows() e se il risultato e' zero schippare direttamente la seconda query senza ricevere errori. Metti la segnalazione di nessun duplicato.

    if(mysql_num_rows(della tua_result_set) == 0) {
    echo "non c'e' ciccia per i gatti";
    exit();
    } else { while...
    esatto
    Errare humanum est, perseverare ovest

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 © 2025 vBulletin Solutions, Inc. All rights reserved.