Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    209

    [sql]eliminazione di record duplicati

    ciao volevo sapere cosa non va in questa query per l'eliminazione di duplicati di mail

    DELETE FROM receivers
    WHERE id NOT IN (
    SELECT MAX( id )
    FROM receivers
    WHERE user_id = '1'
    GROUP BY email
    );

    l'errore prodotto è
    #1093 - You can't specify target table 'receivers' for update in FROM clause

  2. #2
    Per la stessa ragione per cui non puoi fare un insert ... select sui record della stessa tabella.

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    209
    qualche consiglio per eliminare i duplicati con una sola query?

  4. #4
    Originariamente inviato da SPiNALeX
    qualche consiglio per eliminare i duplicati con una sola query?
    con una sola query forse no.... Personalmente quando mi serve faccio cosi':

    codice:
    create temporary table temp
    select * from tabella
    group by campo_doppio;
    
    truncate table tabella;
    
    INSERT INTO tabella
    select * from temp;
    in pratica faccio una copia di singoli record in una tabella temporanea, truncate table in modo da reinizializzare completamente la tabella con i doppioni, e poi faccio copia dalla temp all'originale.

    va eseguito nella stessa pagina php e quindi se fatto con phpmyadmin le tre query vanno messe nella stessa finestra (di query). Si tratta di una manutenzione straordinaria e poi bisognera' evitare che si possano reinserire doppioni.

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

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    209
    DELETE FROM receivers
    WHERE id NOT IN (
    SELECT MAX( id )
    FROM receivers
    WHERE user_id = '1'
    GROUP BY email
    );

    In linea concettuale cosa non va in questa query?
    In italiano sarebbe
    Cancella da riceventi quelli in cui l'id non è fra questi...

    L'idea di creare una nuova tabella e travasare e ritravasare potrebbe essere un collo di bottiglia se n persone lo fanno contemporaneamente...
    L'azione di eliminare i duplicati nel mio contesto è un azione riservata agli user del sito qual'ora volessero, dopo avere inserito un CVS contenente le loro e-mail e ne avessero di doppie, ma non volessero controllarle tutte, ripulire la lista per creare una mailing list

  6. #6
    perche' la tabella target deve essere diversa da quella di origine dei dati.

    poi se la ragioni bene quella query e' inconsistente di suo. Ammesso fosse fattibile ti cancellerebbe tutta la tabella .... NOT IN() ha i valori in OR e quindi uno sull'altro ti farebbe pulizia completa. Poi il group by prenderebbe solo il MAX(id) e quindi se sono piu' di due non risolveresti con una query.

    L'errore e' quello di permettere di avere valori duplicati se questi non debbono esserci. Non e' una operazione da fare tutti i giorni e/o da tutti gli utenti, ma una operazione di manutenzione da riservare al gestore del sito.

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

  7. #7
    Originariamente inviato da SPiNALeX
    L'azione di eliminare i duplicati nel mio contesto è un azione riservata agli user del sito qual'ora volessero, dopo avere inserito un CVS contenente le loro e-mail e ne avessero di doppie, ma non volessero controllarle tutte, ripulire la lista per creare una mailing list
    in questo caso fai una lista delle e-mail dell'utente e con una checkbox permetti al singolo di cancellare i suoi record.

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

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    209
    c'è già la possibilità, ma immagina che uno abbia inserito per sbaglio due volte lo stesso CSV di 1000 contatti e messo a mano qulache email. Quanto NON farebbe l'operazione di cancellare i doppioni a mano selezionandoli, nemmeno io lo farei, e mi accontento e dico "VABBE' LO RICEVERANNO DUE VOLTE" (filtro finale permettendo) e spedisce. Che succede?
    Invio raddoppiato significa, doppio del tempo, della banda, dell'uso del processore del server...
    E se lo facessero 100 utenti questo estro? collasso del server immediato

  9. #9
    come ti dicevo.... fai l'azione di sgombero che ti ho suggerito (prova con una copia) e poi metti un controllo sui campi duplicati.

    Basta gestire il campo univoco con l'indice UNIQUE.

    Ovvio che se qualcuno cambia il nome ...

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

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    209
    Grazie dei suggerimenti, ora provo e faccio un test provando a sovraccaricare il tutto con un pizzico di latenza... ci sarà da divertirsi

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.