Gegenteil von MySQl X IN() gesucht

csskoeln

Grünschnabel
Hallo,

ich speichere in der Datenbank eine Art Zutatenliste für jedes einzelne Produkt (produkte) ab:
0,41,45
oder eben so:
0,1,5,6,7,41

Dann hab ich noch eine Tabelle mit dem Namen Zutaten, hier hat jede Zutat eine fortlaufende ID in der Tabelle.

Das Problem ist, heraus zufinden, welche Zutaten in welchem Produkt ist, anders herum gibt es keine Probleme.

Mit where in ID('x') hab ich es schon probiert, auch mit Like, aber ich komme einfach nicht zum ergebnis, entweder gibt MySQL mir nur einen Artikel aus, oder aber alle und das ist div. falsch, jemand ne Idee?

Hoffe mein Problem wurde verstenden. :rolleyes:
 
Eventuell bist du im PHP Forum falsch aber...warum machst du nicht einfach zwei Tabellen: Einmal Produkte mit ID und Produkt_Name und eine Zweite Tabelle mit Zutat mit ID und Zutat_Name. Und um jetzt eine Beziehung herzustellen brauchst du noch eine dritte Tabelle: ID, ID_Produkt, ID_Zutat. Und jetzt kannst du ganz einfach eine N:M beziehung erstellen. Entweder mit einem Join oder in der Where
 
Hallo Sunny1245,

vielen Dank für deine Antwort, jedoch hab ich doch schon eine Tabelle mit den Produkten und eine mit den Zutaten, bei den Produkten wird die Zutaten ja schon gespeichert, daher muß es ja auch die möglichkeit, hier eine direkte Abfrage zu starten, ohne eine weitere (dritte) Tabelle zu verwenden.

Zudem wird bei einem Produkt ja mehr als eine Zutat in einem Feld (Spalte) gespeichert.
 
Ich verstehe die Anordnung deiner Tabellen nicht so ganz vielleicht kannst du die ja mal anschaulicher Posten.
 
Okay,

ich versuchs mal besser zu erklären.


Tabelle Produkte:
id,name,preis,zutaten

Tabelle Zutaten
id,name, preis

Die ausgewählten Zutaten werden in die Spalte zutaten bei den Produkten gespeichert, in der Form von 0,1,2,3 usw.

Der Wert ist die Fortlaufende ID von den Zutaten.


Die Zutaten jetzt nach zu laden, die bei dem einzelnen Produkt Verfügbar ist, ist nicht das Problem, das geht ohne probleme mit

@mysql_query("SELECT id,name,preis from ibs_zutaten where id IN(".$zutaten.");");

Und genau das brauche ich jetzt anders herum, Ich hab die ID von den Zutaten, möchte jetzt alle Produkte auflisten, die die Zutaten-ID gespeichert haben.
 
Achso du speicherst in Zutaten also mehrere ID's? Also:

ID, Name, Preis, Zutaten
1, Brot, 0,29, (1,2,3,4)

Oder hast du für jede Zutat eine Zeile?
Sorry aber deine Anordnung der Tabellen für das Problem ist doch etwas umständlich.
Und du willst jetzt quasi Wissen welche Produkte die vorgegebene Zutat beinhalten?
 
Hallo,

update:

ok nachdem du nun weitere daten geliefert hast, habe ich die problemstellung falsch interpretiert:

Versuch es doch einfach so:

SQL:
SELECT bla FROM blubb WHERE zutaten LIKE '%,5,%' OR zutaten LIKE '5,%'
 
Zuletzt bearbeitet:
Hallo chibisuke,

super, das hat mir etwas geholfen, mußte es nur etwas erweitern, damit er auch vorne, mitte und hinten nimmt...


PHP:
SELECT id, name from ibs_artikel where 
		zutaten LIKE '%,".$id.",%' 
		OR 
		zutaten LIKE '".$id.",%' 
		or 
		zutaten LIKE '%,".$id."%' 
		
		order by name asc


Danke dir für den Tipp!
 
Dir ist schon klar, dass deine Abfrage nicht ganz das geünschte Ergebnis liefert!?

Beispieltabelle:

ID Name Zutaten
1 Brot 1,2,44
2 Semmel 1,4,13,53
3 Kuchen 33,334,35

Angenommen es wird nach Zutat 4 gesucht
Code:
SELECT id, name from ibs_artikel where 
        zutaten LIKE '%,4,%' 
        OR 
        zutaten LIKE '4,%' 
        or 
        zutaten LIKE '%,4%'

-> was bekommen wir als Ergebnis? Genau:

Brot -> Bedingung ,4x
Semmel -> BEdingung x,4,x

Einfacher - und vor allem eindeutiger:
Code:
...
WHERE CONCAT(zutaten, ',') LIKE '%,4,%'

Was bewirkt mein Code? Das Feld zutaten wird 'on the fly' mit einem abschliessenden Komma versehen; somit werden nur die Datensätze gefunden, in denen der Suchwert am Anfang und am Ende ein Komma hat ;)


In MySql gibt es auch diese hilfreiche Funtion FIND_IN_SET():
Code:
...WHERE FIND_IN_SET(4, zutaten)
4 ist hier der 'suchbegriff' und zutaten ist die Suchliste
 
Zuletzt bearbeitet:
Hallo raiguen,

vielen Dank für deine Nachricht,
Den Befehl FIND_IN_SET kannte ich bis heute noch nicht.

Welche Methode ist den besser,
CONCAT
oder
FIND_IN_SET
?
 

Neue Beiträge

Zurück