Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Hilfe bei Inner Join

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von even2011, 4 Februar 2015.

  1. even2011

    even2011 Neuer Benutzer

    Hallo, ich kniffle jetzt schon einige Stunden an einem Problem und finde leider keine Lösung. Zu meiner Rezept-Datenbank habe mein ERD als Bild angehängt. Das rot umrandete sind die Tabellen, um die es bei meinem Problem geht.

    [​IMG]

    Ziel ist es, herauszufinden, in welchen Rezepte die ausgewählten Zutaten vorhanden sind.

    Ich habe mir 2 Abfragen gebastelt, die leider nicht das erwünschte Ergebnis bringen:

    1.
    select Rezept.Name_Rezept
    from Rezept
    inner join Rezept_Zutat
    on Rezept.ID_Rezept = Rezept_Zutat.ID_Rezept
    inner join Zutat
    on Rezept_Zutat.ID_Zutat = Zutat.ID_Zutat
    where Zutat.Name_Zutat = 'Zwiebeln' or Zutat.Name_Zutat = 'Knoblauch';

    Diese Abfrage liefert mir alle Rezepte mit Zwiebeln und alle Rezepte mit Knoblauch, also auch Rezepte, wo eine dieser Zutaten Fehlt. Ich will jedoch nur Rezepte, wo beide Zutaten enthalten sind.

    2.
    select Rezept.Name_Rezept
    from Rezept
    inner join Rezept_Zutat
    on Rezept.ID_Rezept = Rezept_Zutat.ID_Rezept
    inner join Zutat
    on Rezept_Zutat.ID_Zutat = Zutat.ID_Zutat
    where Zutat.Name_Zutat = 'Zwiebeln' and Zutat.Name_Zutat = 'Knoblauch';

    Da bekomme ich leider gar kein Ergebnis.

    Kann mir da jemand weiterhelfen?
     

    Anhänge:

    • ERD.png
      ERD.png
      Dateigröße:
      29,6 KB
      Aufrufe:
      15
  2. akretschmer

    akretschmer Datenbank-Guru

    Mit der Interpretation von Bildern stehe ich a bissl auf Kriegsfuß. Aber an Deiner stelle würde ich die Zutaten aggregiern (in ein Array) und prüfen, ob in diesen Array Zwiebeln und Knoblauch vorkommen.

    Allerdings, das ist für Dich die schlechte Nacricht: ich nutze (aus Prinzip) kein MySQL. Das, was ich Dir hier vorschlage, ist wohl damit (also MySQL) nicht trivial umsetzbar. Weil MySQL halt einfach massiv in Features beschränkt ist.

    Code:
    test=*# select * from rezepte ;
     id |  zutat
    ----+-----------
      1 | zwiebel
      1 | knoblauch
      2 | zwiebel
      3 | knoblauch
    (4 rows)
    
    Time: 0,153 ms
    test=*# select * from (select id, array_agg(zutat) from rezepte  group by id) foo where array_agg @> array['zwiebel','knoblauch'];
     id |  array_agg
    ----+---------------------
      1 | {zwiebel,knoblauch}
    (1 row)
    
    Mal so als vereinfachtes Beispiel.
     
  3. even2011

    even2011 Neuer Benutzer

    ok danke für die rückmeldung... Dein Ansatz ist nicht schlecht (
    ). Das lässt sich bestimmt in Java realisieren. Allerdings bringt dein Statement mich in MySql nicht weiter :D ... bei meinen bisherigen kenntnissen.

    Welches DB System nutzt du denn?
     
  4. Distrilec

    Distrilec Datenbank-Guru

    Funktioniert das nicht mit einer einfachen Having-Clause? (Reine Theorie... Kann es nicht testen :) )
    Code:
    select r.Name_Rezept
    from   rezept r
    inner  join Rezept_Zutat rz
    on     r.ID_Rezept = rz.ID_Rezept
    inner  join Zutat z
    on     rz.ID_Zutat = z.ID_Zutat
    where  (Zutat.Name_Zutat = 'Zwiebeln' or Zutat.Name_Zutat = 'Knoblauch');
    Group by r.id_rezept having count(z.id_zutat) = 2
     
  5. akretschmer

    akretschmer Datenbank-Guru

    PostgreSQL.
     
  6. ukulele

    ukulele Datenbank-Guru

    Naheliegend für mich wäre erstmal:
    Code:
    SELECT    Rezept.Name_Rezept
    FROM    Rezept
    INNER JOIN Rezept_Zutat rz1
    ON        Rezept.ID_Rezept = rz1.ID_Rezept
    INNER JOIN Zutat z1
    ON        rz1.ID_Zutat = z1.ID_Zutat
    AND        z1.Name_Zutat = 'Zwiebeln'
    INNER JOIN Rezept_Zutat rz2
    ON        Rezept.ID_Rezept = rz2.ID_Rezept
    INNER JOIN Zutat z2
    ON        rz2.ID_Zutat = z2.ID_Zutat
    AND        z2.Name_Zutat = 'Knoblauch';
    Aber diese Lösung skaliert natürlich nicht so wahnsinnig gut, bei vielen Zutaten gibt es viele Joins und viel Code.
     
    Zuletzt von einem Moderator bearbeitet: 5 Februar 2015
  7. even2011

    even2011 Neuer Benutzer

    danke für die Hilfe!!!

    @Distrilec ,dein Tip ist klasse! mit dem group by und der having clausel funktioniert einwandfrei! :)
     
    Zuletzt von einem Moderator bearbeitet: 5 Februar 2015
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden