Moin!
hab grad dickes Brett vorm Kopf und komm nicht auf eine bestimmt total banale SQL-Query:
Nein, die Aufgabenstellung ist alles andere als banal.
Hab eine Tabelle der Form "rezepte_zutaten"
mit rezept_id und zutat_id.
Mit anderen Worten:
Rezepte:
Rührei = 1
Pfannkuchen = 2
Frühstücksei = 3
Zutaten:
Eier = 1
Mehl = 2
Milch = 3
Und verknüpft:
rezept_id zutat_id
1 1
2 1
2 2
1 3
2 3
3 1
Mit anderen Worten: Rührei besteht aus Eiern und Milch, und Pfannkuchen aus Eiern, Mehl und Milch. Das Frühstücksei besteht nur aus Eiern.
Die Frage ist jetzt, was du die Datenbank fragen willst:
Mit der Frage "Was enthält neben anderem Zeugs auch Eier oder Milch" bist du bei deinem jetzigen Query. Da kommen dann allerdings alle drei Rezepte bei heraus.
Alternative Fragemöglichkeiten sind:
"Was enthält mindestens genau die Zutaten, aber ggf. auch noch mehr?"
Die Antwort bei "Eiern, Milch" wäre dann Rührei (enthält Eier und Milch) sowie Pfannkuchen (enthält Eier, Milch, und zusätzlich noch Mehl).
"Was enthält exakt die angegebenen Zutaten?"
Einzige Antwort bei "Eiern, Milch" wäre dann das Rührei.
Ich hab momentan folgndes (mit PHP):
$query = "SELECT rezept_id FROM rezepte_zutaten WHERE zutat_id IN (".join($zutaten_ids, ',').")";
Damit bekomm ich aber alle Rezepte die mindestens eine der Zutaten haben und nicht die deren Zutatenliste komplett in der Menge der übergebenen Zutaten-Ids enthalten ist... ?!
Insbesondere bekommst du mit dieser Abfrage jedes Rezept, welches mehr als eine der gewünschten Zutaten hat, mehrfach in deiner SQL-Ergebnisliste aufgeführt.
Aber genau diesen Effekt kannst du dir zunutze machen:
SELECT rezept_id, count(rezept_id) as zutatentreffer FROM rezepte_zutaten WHERE zutat_ID IN (1,2) GROUP BY rezept_id HAVING zutatentreffer = 2;
Du hast zwei Zutaten, fragst also nach allen Rezepten, die zwei Zutaten "richtig" haben.
Damit kriegst du dann alle Rezepte, die MINDESTENS die geforderten Zutaten enthalten.
Die Frage nach Rezepten, die EXAKT die geforderten Zutaten enthalten, müßte man prüfen, ob die gefundenen Mindest-Rezepte keine weiteren Zutateneinträge besitzen. Ggf. mit einem Subselect (bei MySQL versionsabhängig erst ab 4.1 verfügbar, IIRC).
- Sven Rautenberg
My sssignature, my preciousssss!