[MySql] Alle e-mail addressen vinden.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Vincenz0
  • Registratie: Augustus 2006
  • Laatst online: 12-09 09:48
Dag mede codekloppers.

voor mijn stage-opdracht zit ik met het volgende:

Ik heb een db gekregen die bestaat uit 3 tabellen met verschillende klant gegevens.
Deze tabellen bestaan voor het grootste gedeelte uit varchar velden die in de loop der tijd door de gebruikers zijn ingevuld.
Het nadeel hieraan is dat het dus ook wel eens foutief word ingevuld, bijvoorbeeld een e-mail adres staat in het veld voor het klantnummer.

een paar voorbeeld regels van de tabel: (normaal bevat hij iets van 30 kolommen)
code:
1
2
3
4
tabel1
kolom1   kolom2   kolom3            kolom4           kolom5
1        bedrijf  info@bedrijf.nl   jan@bedrijf.nl   Langeweg 21
2        client   jan@hetnet.nl     C28632           onbekend


Nu is het de bedoeling dat ik een lijst krijg met alle unieke e-mail adressen die in de verschillende tabellen/kolommen staan.

bijvoorbeeld:
code:
1
2
3
4
email
info@bedrijf.nl
jan@bedrijf.nl
jan@hetnet.nl


Nu heb ik zelf zo iets bedacht:
SQL:
1
2
3
4
5
6
7
8
9
10
11
select (Case when kolom1 like '%@%' 
        then Kolom1 
        else (Case when kolom2 like '%@%'
              then kolom2 
              else (Case when kolom3 like '%@%'
                    then kolom3
                    else null
                    end)
              end)
        end) as email
from tabel1


Aan deze oplossing kleven 2 nadelen.
Ten eerste moet ik alle kolommen/tabellen gaan benoemen. en dat zijn er nogal wat.
ten 2e krijg ik natuurlijk nu maar per record in de table 1 maal een e-mail adres terug. bijv:
code:
1
2
3
email
info@bedrijf.nl
jan@hetnet.nl


Mocht je een geniaal idee hebben, roept u maar.


[edit]
oplossing:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select distinct email from
(
    (select kolom1 as email from tabel1 where kolom1 like '%@%.%')
    union all
    (select kolom2 as email from tabel1 where kolom2 like '%@%.%')
    union all
    (select kolom1 as email from tabel2 where kolom1 like '%@%.%')
    union all
    (select kolom2 as email from tabel2 where kolom2 like '%@%.%')
    union all
    (select kolom3 as email from tabel2 where kolom3 like '%@%.%')
    union all
    (select kolom4 as email from tabel2 where kolom4 like '%@%.%')
    order by email asc
) as emaillist

[ Voor 15% gewijzigd door Vincenz0 op 03-03-2009 14:46 ]

Coding 4 Fun!


Acties:
  • 0 Henk 'm!

  • Luqq
  • Registratie: Juni 2005
  • Laatst online: 16:38
Schiet me zo niks te binnen, maar lekkere DB layout heb je als ze email adressen bij een klantnummer kunnen invullen..

Acties:
  • 0 Henk 'm!

  • Vincenz0
  • Registratie: Augustus 2006
  • Laatst online: 12-09 09:48
Luqq schreef op dinsdag 03 maart 2009 @ 12:59:
Schiet me zo niks te binnen, maar lekkere DB layout heb je als ze email adressen bij een klantnummer kunnen invullen..
100% mee eens, die db komt van een extern bedrijf en ik ben dus een nieuw programma aan het ontwikkelen en moet onderandere verschillende brokken oude data gebruiken

[ Voor 4% gewijzigd door Vincenz0 op 03-03-2009 13:01 ]

Coding 4 Fun!


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
UNION ALL per kolom, in elke subquery naar dezelfde alias hernoemen en dan over de totale query een distinct. :Y)

(Maar dan nog is het datamodel inderdaad een enorme WTF)

[ Voor 20% gewijzigd door Voutloos op 03-03-2009 13:03 ]

{signature}


Acties:
  • 0 Henk 'm!

  • Mr_Light
  • Registratie: Maart 2006
  • Niet online

Mr_Light

Zo-i-Zo de gekste.

Ik zou gewoon alles naar binnen trekken (of mischien iets minder bruut en in stukken)(en/of met heuristieken: (alleen dingen welke een '@' bevatten binnenhalen))

en dan vervolgens stukje code schrijven en de informatie er uit halen. Je zal ook moeten kijken of domein namen wel bestaan of iets in die trant.

Daarna zou ik de db admin met een rubberen kip een paar meppen geven.

IceManX schreef: sowieso


Acties:
  • 0 Henk 'm!

  • ari
  • Registratie: November 2007
  • Laatst online: 01-08 22:36

ari

Je kunt een script schrijven dat alle tabellen in je db uitleest, en daarna alle kolommen per gegeven tabel. Vervolgens voer je dan per keer een query uit om uit die kolom alle e-mailadressen te pakken.

Dan heb je alle adressen uit je db, dan hoef je ze alleen nog maar te filteren.

Acties:
  • 0 Henk 'm!

  • Vincenz0
  • Registratie: Augustus 2006
  • Laatst online: 12-09 09:48
Ik heb het liefste een MySQL-only oplossing ivm optimalisatie, mocht dat niet lukken dan kan ik nog wel kijken of ik het aan de client kant opgelost kan worden.

@ Voutloos, hmm das een goede, alleen moet nog steeds alle kolommen/tabbellen bij naam benoemen. Toch even proberen.

[ Voor 27% gewijzigd door Vincenz0 op 03-03-2009 13:10 ]

Coding 4 Fun!


Acties:
  • 0 Henk 'm!

  • JHMvP
  • Registratie: December 2002
  • Laatst online: 02-11-2024

JHMvP

Veritas logica est

Als ik nou een stukje HTML heb waarmee je alle emailadressen uit een tekstvak haalt...kun je gelijk aan de slag! Is wel geen SQL en ik weet niet of dat zomaar mag...

AS/400, Linux, Novell, Windows, DOS, OS/2...luck has nothing to do with it.
*** Ignorance and nonchalance will lead us happily into slavery of evil ***


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
De sql query die ik voorstel heb je in max 5 minuten geschreven?

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Hieronder vind je iets om door je kolommen te lopen van je tabel (gebruik maken van de systeemtabellen) ...

Het is wel voor SQL-server van MS, maar MYSQL heeft dat ook dachtek ...

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=70539

Acties:
  • 0 Henk 'm!

  • Vincenz0
  • Registratie: Augustus 2006
  • Laatst online: 12-09 09:48
Ik heb het maar gedaan op de manier die Voutloos aangeeft:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select distinct email from
(
    (select kolom1 as email from tabel1 where kolom1 like '%@%.%')
    union all
    (select kolom2 as email from tabel1 where kolom2 like '%@%.%')
    union all
    (select kolom1 as email from tabel2 where kolom1 like '%@%.%')
    union all
    (select kolom2 as email from tabel2 where kolom2 like '%@%.%')
    union all
    (select kolom3 as email from tabel2 where kolom3 like '%@%.%')
    union all
    (select kolom4 as email from tabel2 where kolom4 like '%@%.%')
    order by email asc
) as emaillist


Het controleren of de mail adressen valide zijn gebeurt al in de code.
Bedankt voor de hulp jongens.

[ Voor 5% gewijzigd door Vincenz0 op 03-03-2009 14:44 ]

Coding 4 Fun!


Acties:
  • 0 Henk 'm!

  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 22-09 22:11
Voutloos schreef op dinsdag 03 maart 2009 @ 13:03:
UNION ALL per kolom, in elke subquery naar dezelfde alias hernoemen en dan over de totale query een distinct. :Y)

(Maar dan nog is het datamodel inderdaad een enorme WTF)
Waarom UNION ALL icm distinct. Gebruik dan gewoon een normale union en dubbele waardes worden er al uit gefilterd :)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Hmz klopt. Is een dwangneurose van mij, als optimalisatie tov UNION welke default distinct is. Lees: ik schrijf automagisch all tenzij het niet juist is. O-)

(Niet gebenchmarked, maar het is zelfs mogelijk dat allemaal union alls en dan daarover een distinct sneller is. Maar meten is weten, triviale optimalisatie, of wellicht wel erg micro/prematuur)

[ Voor 38% gewijzigd door Voutloos op 03-03-2009 15:24 ]

{signature}

Pagina: 1