Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Recuperare dati duplicati da tabella (MySql)

    Ciao,
    sono (nuovamente) qui per chiedere un aiuto nella soluzione di un problemino.
    Ho una tabella in MySql che contiene le email associate a un contatto. Queste mail non sono univoche poichè ovviamente una mail può essere associata a differenti contatti di differenti utenti. Il "problema" è che questo implica ovviamente che due o più contatti di uno stesso utente possano avere una o più email duplicate.
    Faccio un esempio per farmi capire.
    Utente Pippo:
    contatto Pluto, mail1 pluto@paperopoli.it, mail2 pluto@azienda.it
    contatto Paperino: mail1 pluto@paperopoli.it, mail2 paperino@azienda.it
    contatto Minnie: mail1 minnie@topolinia.it

    Il perchè può succedere questa situazione non è rilevante ai fini della soluzione del problema. Quello che vorrei fare è trovare i contatti (in questo caso Pluto e Paperino) che hanno una o più mail in comune.

    La tabella per le email è la classica ID, ID_Contatto, Email e la tabella dei contatti collegante è la classica ID, Nome dove c.ID si collega a e.ID_Contatto.

    La soluzione più veloce (ma meno efficente) che mi è venuta in mente è semplicemente recuperare tutte le mail, ciclare e trovare quelle uguali, ma ovviamente se si tratta di 20 contatti è fattibile; non lo è se i contatti sono 7.000 (che sono anche pochi per il progetto relativo).

    Qualche idea?
    Grazie a tutti, ciao

  2. #2
    vuoi trovare gli indirizzi email uguali indipendentemente dal'utente? o solo quelle che si ripetono all'interno dello stesso utente?

  3. #3
    Ciao,
    no solamente quelli che si ripetono per lo stesso utente. Dato che ti è sorta la domanda meglio se aggiungo qualche riga di spiegazione.
    Tabelle implicate
    Utenti
    Contatti
    Email

    Formato
    U: ID, Nome
    C: ID, ID_Utente, Nome
    E: ID, ID_Contatto, Email

    Relazioni
    U.ID => C.ID_Utente (1 => molti)
    C.ID => E.ID_Contatto (1 => molti)

    Scopo
    Trovare i C.ID di un Utente dove E.Email è identico per C.ID diversi, cioè trovare tutti gli id contatto che hanno una o più mail "comuni", appartenenti allo stesso utente.

    Tabella relazionata di esempio
    U.ID, C.ID, E.ID, E.Email
    1, 4, 7, mario@pippo.it
    1, 4, 9, giuseppe@mail.it
    1, 8, 14, mario@pippo.it
    2, 13, 32, mario@pippo.it

    se cerco per l'utente 1, mi dovrebbe trovare questi C.ID: 4, 8 (perchè fanno parte dello stesso utente e la mail è la stessa ma per contatti diversi)

    Grazie

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Se vuoi farlo in un unico passaggio non saprei cosa dirti
    perche non conosco bene MySql

    ___________________________________________

    Se puoi farlo in piu passaggi allora:

    ____________________________________________

    Partendo dalla tua tabella di esempio che chiamiamo "Vista01"

    ____________________________________________

    produci la "Vista02" con i seguenti campi:
    U.ID _____ Raggruppato
    C.ID _____ Conteggio
    E.Email __ Raggruppato


    e di questa filtri i valori di C.ID maggiori di 1


    sui dati del tuo esempio ottieni questo risultato

    U.ID, C.ID, E.Email
    1, 2, mario@pippo.it


    __________________________________________________ ___

    adesso produci una terza vista "Vista03"

    che riprende tutti i campi di "Vista01"
    e la metti in join con "Vista02"

    Vista01:U.ID = Vista02:U.ID
    Vista01:E.Email = Vista02:E.Email

    __________________________________________________ __

    sei arrivato al tuo risultato

  5. #5
    Grazie nman per il suggerimento.
    Se possibile vorrei però evitare di costruire viste e simili perchè le trovo estremamente scomode (per queste situazioni).
    Attendo di vedere se qualcuno è in grado di indirizzarmi verso una soluzione "per query", altrimenti valuto la tua.

    Grazie, ciao

  6. #6
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    Non so se ho capito bene...
    partendo dall'esempio di tabella e dai risultati voluti,questa:
    codice:
    SELECT *
    	FROM `Email`
    	GROUP BY email, U.id
    	HAVING count( E.ID ) >1
    restiuisce 1 record con U.id= 1
    quindi selezioni tutti i record di Email (subquery):
    codice:
    SELECT *
    FROM `Email`
    WHERE U.id
    IN (
    	SELECT U.id
    	FROM `Email`
    	GROUP BY email, U.id
    	HAVING count( E.ID ) >1
    )
    ma ti restituisce anche il record con email=giuseppe@mail.it. usa distinct su C.ID o prova così
    codice:
    SELECT *
    FROM `Email`
    WHERE concat( U.id, email )
    IN (
    	SELECT concat( U.id, email )
    	FROM `Email`
    	GROUP BY email, U.id
    	HAVING count( E.id ) >1
    )
    p.s. prestazioni da valutare, ma se ci sono gli indici, se i record non sono molti e se è una query di controllo da fare ogni tanto...
    p.s.s. sostituisci i vari U.id, e.id etc
    p.s.s.s. non testate, spero di non aver scritto vaccate

  7. #7
    Grazie anche a te enoa,
    però le tabelle sono 3, separate
    Quella che ho messo come "Tabella relazionata di esempio" è una rappresentazione delle tre tabelle joinnate...

    Ora comunque mi studio anche la tua soluzione!

    Grazie

  8. #8
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    Si bhe, la logica un po' cambia se inserisci le altre 2 tabelle in join , ma non più di tanto

  9. #9
    Ho trovato questa soluzone, che credo possa andare bene

    SELECT c.ID, c.Email as email_c, e.email_completa as email_e
    FROM crm_contatti c
    left join email e
    on c.ID = e.ID_contatto
    where c.ID_Utente = 11
    group by c.ID
    HAVING ( COUNT(email_c) > 1 or COUNT(email_e) > 1)
    order by email_c ASC

    Da qualche prova fatta mi pare che restituisca correttamente i record!

    Grazie a tutti

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