Stefan Schälle: SUB Queri mit Bedingung im Sub Query

Hallo Zusammen

Habe das Problem das es in MySql ja noch keine Sub Qerys gibt, jedoch habe ich nur eine Anleitung gefunden, in welcher sich keine Bedingungen im Sub definieren lassen.

The queries:

SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 WHERE table1.id=table2.id);

Can be rewritten as:

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;

Die funktioniert auch. Wenn ich jetzt aber auch noch in der Tabelle table2 z.B. plz = '9999' dann funktioniert das ganze nicht mehr.

Kann mir jemand da weiterhelfen, oder muss ich das mit einer temp Tabelle machen???

Besten Dank schon im vorherein.

Gruss Stefan

  1. Hi,

    SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;

    Diese Lösung basiert darauf, dass der LEFT JOIN bei einer Nicht-Übereinstimmung der IDs (also wenn sich kein passender Datensatz findet) eine leere ID bei table2.id hinterlässt
    id1   id2
    1     1
    2     2
    3     -

    Aus diesem Ding bleibt jetzt also nur die Zeile über, bei der diese id2 NULL ist, demnach die Zeile mit der 3.

    Die funktioniert auch. Wenn ich jetzt aber auch noch in der Tabelle table2 z.B. plz = '9999' dann funktioniert das ganze nicht mehr.

    Was hast du jetzt hiermit vor?
    SELECT * FROM tab1 WHERE id NOT IN (SELECT * FROM tab2 WHERE plz='9999')

    Lass mich mal basteln:
    SELECT * FROM tab1 LEFT JOIN tab2
    ON tab1.id = tab2.id
    WHERE tab2.id IS NULL
       OR tab2.plz <> '9999'

    Ich behaupte, auf diese Weise sorgt er dafür, dass nur die Datensätze überleben, deren ID gar nicht in tab2 vorkommen, oder aber diejenigen die zwar vorkommen, bei denen aber die zugehörige PLZ toleriert wird...

    Aber ist nur ein Versuch - Ich liebe Subqueries und andere DBMS...

    MfG
    Rouven

    --

    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. Also,

      Habe deinen Versuch auch mal ausprobiert, hat aber nicht ganz das gwünschte Ergebniss gegeben. Also hier noch die orginal Abfrage:

      SELECT messenger\_user\_to\_user.user\_nr
      FROM messenger\_user\_to\_user
      WHERE messenger\_user\_to\_user.user\_nr NOT IN (SELECT messenger\_user\_to\_forum.user\_nr FROM messenger\_user\_to\_forum WHERE messenger\_user\_to\_forum.topic\_nr = '$topic_nr') AND (messenger\_user\_to\_user.to\_user\_nr = '$user_id')

      Hier einmal eine LEFT JOIN Abfrage mit einer bedingung in der Join Tabelle:
      SELECT
        messenger\_user\_to\_user.user\_nr,
        messenger\_user\_to\_forum.user\_nr AS field1
      FROM
        messenger\_user\_to\_user
        LEFT JOIN messenger\_user\_to\_forum ON (messenger\_user\_to\_user.user\_nr = messenger\_user\_to\_forum.user\_nr)
      WHERE
        (messenger\_user\_to\_forum.topic\_nr = '43') AND
        (messenger\_user\_to\_user.to\_user\_nr = '2')

      Funktioniert eben schon nicht. Habe es auch mit (messenger\_user\_to\_forum.topic\_nr = '43' OR messenger\_user\_to\_forum.topic\_nr IS NULL) versucht, hat aber auch nicht das gewünschte Ergebniss gebracht.

      Merci für deine Hilfe und ein Gruss aus der Schweiz

      Stefan

      1. Und jetzt musst du mir mal auf die Sprünge helfen, was heißt bei dir es funktioniert nicht? Fehlermeldung oder falsches Ergebnis?

        Du könntest auch noch versuchen, das Kriterium im ON-Teil des JOINS unterzubringen:
        FROM messenger_user_to_user LEFT JOIN messenger_user_to_forum
        ON (messenger_user_to_user.user_nr = messenger_user_to_forum.user_nr
         AND messenger_user_to_forum.topic_nr <> 43)
        ^^^^
        oder OR
        Ausprobieren....

        MfG
        Rouven

        --

        -------------------
        ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
        1. Supper, merci.

          Du warst meine Rettung.

          Das stand ganz klein in der Referenz und es hat doch auch wirklich funktioniert.

          Merci und noch einen schönen Abend.

          Gruss Stefan

          PS: Man hat wohl nie Ausgelernt