Hilfe bei Inner Join

even2011

Neuer Benutzer
Beiträge
3
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.



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
    29,6 KB · Aufrufe: 15
Werbung:
Da bekomme ich leider gar kein Ergebnis.

Kann mir da jemand weiterhelfen?

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.
 
ok danke für die rückmeldung... Dein Ansatz ist nicht schlecht (
würde ich die Zutaten aggregiern (in ein Array) und prüfen, ob in diesen Array Zwiebeln und Knoblauch vorkommen.
). 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?
 
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';

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
 
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 bearbeitet von einem Moderator:
Werbung:
Zurück
Oben