Montag, 5. Mai 2014

SET in SET Query...


... aber wie???


Hallo zusammen,
nach langer Pause nun auch mal wieder ein kleiner Beitrag, um erlerntes Wissen zu teilen.

 

Problemstellung:

Ich habe eine 1:n Relation zwischen zwei Entitäten ohne Kreuztabelle. Als Beispiel seien dies Kategorien und Produkte. Wobei ein Produkt mehrere Kategorien besitzen kann. Dies wird über eine eigene Spalte im Produkt (categories) abgebildet, die eine kommaseparierte Liste von Kategorien enthält.
Solange ich nur mit einer Kategorie abfrage - also "gib mir alle Produkte die in Kategorie 80 sind" ist alles relativ einfach. Sobald ich aber mit einem Set an Kategorien (180,30,27) komme und ich alle Produkte haben möchte, die einer dieser Kategorien zugeordnet sind, wird es komplex.

mögliche Lösung:

Damit die Arbeit von der DB erledigt wird und ich bspw. im PHP nicht nacharbeiten oder n-Anfragen stellen muss um das Problem zu lösen, kann man mit einer Regex auf der DB arbeiten.
Als Where-Klausel im SQL kann z.Bsp. folgendes verwendet werden:
'category REGEXP "((^|,)(' . implode(')(,|$))|((^|,)(', $categories) . ')(,|$))"';
 Dadurch wird folgendes erzeugt:
category REGEXP "((^|,)(80)(,|$)) | ((^|,)(31)(,|$)) | ((^|,)(20)(,|$))"
Beachtet werden muss, dass bspw. category = 22,180,30 sein kann damit die REGEX (80) nicht auch die 180 trifft, muss Auf Anfang/Komma/Ende geprüft werden. Daher wird jeder Wert der gesucht wird als folgende Regex angegeben:
((^|,)(80)(,|$))
Die einzelnen Werte werden dann durch | als oder-Verknüpfung verknüpft.

Und schon geht es!

 

 

Hinweis:

Dies ist nicht optimal, aber wenn die DB-Struktur nicht angepasst werden kann dann ist dies ein gangbarer Weg.