1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Abfrage aus einer n:m Relation

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von gliese_518c, 5 Oktober 2011.

  1. gliese_518c

    gliese_518c Neuer Benutzer

    Hallo liebe SQL Spezies :)

    ich dreh mich gerade im Kreis bei einer eigendlich recht einfachen Abfrage

    auf 2 Tabellen (tab1 + tab2) die in einer n:m Relation stehen.

    Nun möchte ich das mir alle Werte aus tab1 gegeben werden

    die nicht in der tab3 mit dem Wert 2 (Fleisch) vorkommen..

    tab1

    _________

    | id | titel |

    ------------

    | 1 | Hase |

    -------------

    | 2 | Katze |

    -------------

    | 3 | Maus |

    -------------

    | 4 | Schwein |

    -------------

    tab2

    _____________

    | id | Nahrung |

    -------------------

    | 1 | Gemüse |

    -------------------

    | 2 | Fleisch |

    ---------------------

    hier die Relation

    tab1_eats_tab2

    ________________

    | tab1_id | tab2_id |

    -----------------------

    | 1 | 1 |

    ----------------------

    | 2 | 1 |

    ---------------------

    | 3 | 2 |

    ---------------------

    | 4 | 1 |

    ---------------------

    | 4 | 2 |

    ---------------------

    folgendes habe ich versucht aber das ist falsch:

    SELECT tab1.title
    FROM tab1
    LEFT JOIN tab1_eats_tab2
    ON tab1.id = tab1_eats_tab2.tab1_id
    WHERE tab1_eats_tab2.tab2_id !=2

    Was mache ich falsch?

    vielen Dank im Voraus!!

    gruss

    Stefan
     
  2. ukulele

    ukulele Datenbank-Guru

    In MSSQL ist die Syntax richtig, in MySQL vermutlich auch. Eventuell hast du title mit titel verwechselt?

    Ansonsten versuch mal das hier:
    Code:
    SELECT    tab1.titel
    FROM    tab1,
            tab2,
            tab1_eats_tab2
    WHERE    tab1.id = tab1_eats_tab2.tab1_id
    AND        tab2.id = tab1_eats_tab2.tab2_id
    AND        tab2.Nahrung != 'Fleisch'
     
  3. gliese_518c

    gliese_518c Neuer Benutzer

    hallo ukulele
    vielen Dank für DeineAntwort!
    Ja, stimmt, die Syntax ist richtig.
    Ich merke gerade das ich das in meinem ersten Beitrag nicht
    eindeutig beschrieben habe... Entschuldige bitte!
    Das Ergebniss der Abfrage soll so sein
    das nur die 'reinen' Gemüsefresser ausgegeben werden
    also ohne das Schwein....

    Wenn ich zB. folgendes probiere (hab die Tabellennamen
    zur besseren Lesbarkeit mal angepasst):

    Code:
    SELECT t.title FROM tiere t
    WHERE t.id =(SELECT tiere_id FROM
    tier_isst_futter tf WHERE futter_id != 2)
    dann kommt der Fehler:

    Code:
    #1242 - Subquery returns more than 1 row
    Ich hoffe ich konnte mein Problem halbwegs verständlich
    beschreiben....

    viele Grüße
    Stefan
     
  4. ukulele

    ukulele Datenbank-Guru

    Den Fehler behebst du, in dem du statt "= ( SELECT" ein "IN ( SELECT" verwendest. Damit kannst du gegen mehrere Werte prüfen.
     
  5. gliese_518c

    gliese_518c Neuer Benutzer

    ... Super das funktioniert... aber es wird immer noch 'Schwein' mit ausgegeben..
    Geht das überhaupt das ich nur die ohne Fleisch als Ergebniss bekomme?

    Code:
    SELECT t.title
    FROM tiere t
    WHERE t.id
    IN (
    
    SELECT tiere_id
    FROM tier_isst_futter tf
    WHERE futter_id !=2
     
  6. ukulele

    ukulele Datenbank-Guru

    Eventuell so:
    Code:
    SELECT    tab1.titel
    FROM    tab1
    WHERE    tab1.id NOT IN (    SELECT    tab1_eats_tab2.tab1_id
                                FROM    tab1_eats_tab2
                                WHERE    tab1_eats_tab2.tab2_id IN (    SELECT    tab2.id
                                                                    FROM    tab2
                                                                    WHERE    tab2.Nahrung = 'Fleisch' ) )
    Hab das jetzt aber nicht getestet. Generell geht das, es gibt ja auch noch verschiedene andere JOINS. Ich persönlisch schachtel eigentlich lieber SELECTs ineinander, da blick ich nachher besser durch. Du kannst auf jedenfall mit NOT IN oder NOT EXISTS arbeiten.
     
  7. gliese_518c

    gliese_518c Neuer Benutzer

    Hey Super! Jipiieeh! :)
    Genauso funktioniert es !
    Daaaaaaaaannke!
     
Die Seite wird geladen...

Diese Seite empfehlen