Hallo.
Ich versuch mich kurz zu fassen ;>
Ich habe mir jetzt nochmal die DDL der Tabellen mit etwas mehr Ruhe angesehen und glaube zu verstehen wie das gedacht war.
Wenn ich da richtig liege, dann ist in Zutaten zu jedem Rezept je ein Eintrag pro verwendeter Zutat zu erwarten sprich,
wenn die 300 Rezepte alle mit Salz zu tun haben, dann hat Zutaten auch 300 Zeilen mit Salz?
Also wenn Du denn selbst Programm und Datenbank erstellst/programmierst solltest Du das Statement auf jeden Fall dynamisch erstellen und keine joins machen, wo nichts gesucht wird.
Ein Statement wie Du es brauchst wenn ein gesuchtes Rezept jeweils alle angegebenen Zutaten auch enthalten soll mit 5 gegebenen Zutaten sieht ungefaehr so aus
(wobei ich bitte das konkret gegen MySQL zu checken, da bin ich nicht fit mit! Also bitte nochmal verifizieren!):
Code:
SELECT DISTINCT Rezepte.ID, Rezepte.Name, Rezepte.Beschreibung FROM Rezepte,
Zutaten AS Zutaten1, Zutaten AS Zutaten2, Zutaten AS Zutaten3,
Zutaten AS Zutaten4, Zutaten AS Zutaten5
WHERE Rezepte.ID = Zutaten1.Rezept_ID AND Zutaten1.Name LIKE '%$zutat1%'
AND Rezepte.ID = Zutaten2.Rezept_ID AND Zutaten2.Name LIKE '%$zutat2%'
AND Rezepte.ID = Zutaten3.Rezept_ID AND Zutaten3.Name LIKE '%$zutat3%'
AND Rezepte.ID = Zutaten4.Rezept_ID AND Zutaten4.Name LIKE '%$zutat4%'
AND Rezepte.ID = Zutaten5.Rezept_ID AND Zutaten5.Name LIKE '%$zutat5%'
Das ist ein Vorschlag fuer den IST-Zustand mit "quasi Volltextsuche" -> Ein Pfefer und ein Pfeffer in der Zutaten-Tabelle fuehrt da aber auch zu Ungenauigkeiten;> .
Ein Verbesserungsvorschlag fuer Performance und Bedienung:
Die Stammdaten der Zutaten sollten tatsaechlich (ID, Name evtl Beschreibung, das waere ein schoenes Feature fuer Texte wie "Lieber zwei kleine als einen grossen Kohlrabi nehmen, der ist holziger")
separat in einer Tabelle stehen;
Das Datum "Menge" gehoert eigentlich zu einer "Rezept-Position" die technisch eine Verbindung zwischen einem Rezept und einer Zutat abbildet.
Das kaeme in eine dritte Tabelle, in der dann die ID des Rezeptes, die ID der Zutat und die Menge in je einer Zeile stehen, Index ueber die zwei ID Spalten.
Die Rezept-ID kann dann neben der Menge auch in den Zutaten entfallen.
Im Endeffekt soll dann in der Zutaten Tabelle jede Zutat nur einmal stehen.
Im Programm / Frontend koennen dann beim Erfassen eines Rezeptes die Zutaten nacheinander aus einer Liste aller bekannten Zutaten ausgewaehlt oder bei der Gelegenheit eine neue Zutat angelegt werden.
Zum Suchen von Rezepten nach Zutaten die zu suchenden Zutaten aus einer Liste aller bekannter Zutaten auswaehlen lassen.
Ggfs kann man auch noch die Moeglichkeit einraeumen entweder die Zutaten auszuwaehlen oder einen freien Text als Name einzugeben,
dort wo der Text steht suchst Du halt zuerst die Zutaten aus den Stammdaten und kannst dann mit den ID's die Rezepte suchen, bei denen aus der Liste solltest Du die ID's schon haben.
Bei der veraenderten Datenstruktur hast Du insgesamt weniger Daten, solche Queries wie oben verarbeiten dann auch weniger Daten (wegen weniger Zeilen in Zutaten und dort folglich weniger Text in der Spalte Name)
und der Join der dann Rezepte und Zutaten zusammenbring kommt in Gaenze mit ID's aus => sehr schnell bei Vergleichsoperationen.
Ich wollte mich kurz fassen ;>
Ciao,
Mercy.