Sätze mit gleichen Werten finden und andere Ausschliessen

xrax

Erfahrenes Mitglied
Hallo zusammen,

ich habe folgende Problemstellung zu der mir keine passende Query gelingen will.

Die Tabelle mytab hat als PK die Felder vorname und nachname.

Nun werden alle Zeilen mit den Vornamen der Maiers an ein Programm gesendet . Dieses verwendet die Vornamen und führt einige Operationen aus.

Code:
SELECT vorname,nachname FROM mytab WHERE vorname IN (SELECT vorname FROM mytab WHERE nachname='Maier')

Ergebniss:
Paul Maier
Paul Panzer
Hans Maier
Hans Huber
Hans Müller

Danach soll das selbe mit den Vornamen für nachnamen=Müller gemacht werden.

Da aber zB bei Hans Maier, Hans schon bearbeitet wurde, möchte ich die Vornamen die für Maier vorkamen bei Müller nicht mehr im Ergebniss haben.

Die Tabelle wird ca. 5.000 bis 10.000 verschiedene nachnamen mit jeweil 500 bis 20.000 vornamen haben.

Hat jemand eine Idee wie ich für mein Problem eine flotte Query hinbekomme?

Mit bestem Dank
xrax
 
Erster Hinweis: entferne den Primary Key von Vornamen und Nachnamen und nutze an Stelle dessen eine eindeutige ID mit Auto-Inkrement dafür. Dadurch kannst du dann auch nachsehen, ob die entsprechende ID schon in deiner Liste ist und somit einen doppelten Eintrag vermeiden.
 
Hm,- hab ichs falsch beschrieben, hast dus falsch verstanden?
Jedenfalls passt deine Antwort nicht zu meiner Frage.

Trotzdem,- besten Dank

Gruß
xrax
 
Nein, du hast es nicht falsch geschrieben und ich habe es nicht falsch verstanden. Leider hast du meine Antwort falsch verstanden, denn wenn du meinen Ansatz verfolgst, dann ist das Lösen deines Problemes eine Kleinigkeit.
 
Hi crack. Ich glaube er meint was anderes.

1) Nimm alle Namen deren Vornamen auch bei Maiers vorkommen
2) dito für Müller ausser den Vornamen die bei Maiers bereits vorkommen.

Ich geh mal davon aus, es handelt sich um MySQL. Ansosnten für die DB halt einfach mein Ding entsprechend umscrheiben.
Ich habe in der letzten Zeile extra den Befehl FIELD drin und nicht einfach nachname = 'Maier', da nach dem Müller und Maier ev. noch andere Abfragen folgen. Dann muss jeweils einfach der FIELD()-Befehl um den Namen ersetzt werden. Wenn du nach Maier und Müller auch noch den Panzer auswählen willst, dann sieht der FIELD()-Befehl so aus
SQL:
FIELD(nachname, 'Maier', 'Müller')

Und hier nun meine Lösung
SQL:
SELECT 
    vorname,
    nachname 
FROM 
    mytab     
WHERE 
    vorname IN (
                SELECT vorname 
                FROM mytab 
                WHERE nachname='Müller')
    AND vorname NOT IN (
                SELECT vorname
                FROM mytab
                WHERE FIELD(nachname, 'Maier'))
 
Zuletzt bearbeitet von einem Moderator:
Danke yaslaw, das bringt das gewünschte Ergebniss.

FIELD war mir völlig neu.

Braucht allerdings bereits 10 - 20 sek bei 1.5 Mio Einträgen und 8 nachname im NOT IN (SELECT.....
Inzwischen weis ich auch das es bis zu 500.000 nachnamen und ca. 20.000 vornamen geben wird.

Ich probier das jetzt aus, aber das dauert doch bestimmt ewig wenn ich > 5Mio. einträge hab und vielleicht hunderte nachnamen im NOT IN (SELECT.....

Besten Dank
xrax
 
ggf ist sowas schneller.
Aber mit dem FIELD un deinen Millionen Einträgen wirds probleme geben. Das muss man anderst lösen
SQL:
SELECT 
    t1.vorname,
    t1.nachname 
FROM 
    mytab AS t1
    INNER JOIN (SELECT vorname FROM mytab WHERE nachname='Müller') AS v1
        ON t1.vorname = v1.vorname
     LEFT JOIN (SELECT vorname FROM mytab WHERE FIELD(nachname, 'Maier')) AS v2
        ON t1.vorname = v2.vorname
WHERE 
    v2.vorname IS NULL
 
Zuletzt bearbeitet von einem Moderator:
Zurück