tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von einfach nur crack
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
611
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    xrax xrax ist offline Mitglied Gold
    Registriert seit
    Oct 2004
    Beiträge
    133
    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 :
    1
    
    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
     

  2. #2
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist offline mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.961
    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.
     
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

  3. #3
    xrax xrax ist offline Mitglied Gold
    Registriert seit
    Oct 2004
    Beiträge
    133
    Hm,- hab ichs falsch beschrieben, hast dus falsch verstanden?
    Jedenfalls passt deine Antwort nicht zu meiner Frage.

    Trotzdem,- besten Dank

    Gruß
    xrax
     

  4. #4
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist offline mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.961
    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.
    xrax bedankt sich. 
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

  5. #5
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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
    Code sql:
    1
    
    FIELD(nachname, 'Maier', 'Müller')

    Und hier nun meine Lösung
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    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'))
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  6. #6
    xrax xrax ist offline Mitglied Gold
    Registriert seit
    Oct 2004
    Beiträge
    133
    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
     

  7. #7
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    ggf ist sowas schneller.
    Aber mit dem FIELD un deinen Millionen Einträgen wirds probleme geben. Das muss man anderst lösen
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    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
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

Ähnliche Themen

  1. DB2 Version 5.4 Update auf mehrere Sätze mit inner Select auf andere Datei
    Von fuDDel im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 24.08.10, 08:24
  2. Array mit gleichen Werten
    Von lara23 im Forum Java
    Antworten: 2
    Letzter Beitrag: 28.12.08, 12:38
  3. Antworten: 2
    Letzter Beitrag: 19.07.05, 11:53
  4. Datensätze mit gleichen werten werden nicht gespeichert
    Von die-muecke im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 10.08.04, 20:47
  5. Zwei-Tabellen, aber mit gleichen Werten
    Von Feldhofe im Forum PHP
    Antworten: 8
    Letzter Beitrag: 28.06.02, 15:28