[MySQL] Suchen in Stichworttabellen mit UND-Verknüpfung

Tribal

Grünschnabel
Hallo zusammen,

erst einmal ein "Hallo" in die Runde, ist mein erster Eintrag hier, allerdings hat mir diese Seite schon ein paar mal geholfen.

Jetzt habe ich ein Problem (oder sehe den Wald vor lauter Bäumen nicht):
Ich erstelle gerade eine Bilderdatenbank, Grundgedanke ist, dass der Nutzer später anhand von Tags die Daten filtern kann. Jedoch habe ich genau mit der Filterung ein Problem. Ich vermute fast, dass mein Datenmodell nicht optimal für diese Anwendung ist. Aber ich schreib erst mal kurz, wie mein bisheriger Ansatz ist.

Ich habe mir insgesamt 3 Tabellen erstellt:
Code:
Tabelle "Bilder"

BildID   |Bildpfad            |Bildbeschreibung
---------+--------------------+--------------------
  1      | ./images/pic1.jpg  | blabla
  2      | ./images/pic2.jpg  | suelz
  3      | ./images/pic3.jpg  | laber
  4      | ./images/pic4.jpg  | nix

Code:
Tabelle "BilderTags"

TagID    |Tagname         
---------+--------------------
  1      | Anbau 
  2      | Kompressor 
  3      | Stahlblech 
  4      | Edelstahl

Code:
Tabelle "XBilderTags"

XBTID |xBildID | xTagID         
------+--------+-------
  1   |    1   |   1
  2   |    1   |   2
  3   |    1   |   3
  4   |    2   |   1
  5   |    2   |   2
  6   |    2   |   3
  7   |    3   |   1
  8   |    3   |   2
  9   |    3   |   3
 10   |    4   |   1
 11   |    4   |   2
 12   |    4   |   4

Daraus ergeben sich folgende Bilder<=> Tag Kombinationen:

Code:
pic1.jpg = Anbau, Kompressor, Stahlblech
pic2.jpg = Anbau, Kompressor, Stahlblech
pic3.jpg = Anbau, Kompressor, Stahlblech
pic4.jpg = Anbau, Kompressor, Edelstahl

Meine Idee war, jetzt einfach eine Abfrage über die XBilderTags Tabelle laufen zu lassen um bspw. alle Anbaugeräte mit Kompressor aus Stahlblech laufen zu lassen. Das ist jedoch eine UND-Verknüpfung, da ja alle 3 Bedingungen erfüllt sein müssen. Mit einer ODER-Verknüpfung bekomme ich dann ja alle 4 Bilder als Ergebnis.

Habe ich zu stark normalisiert oder bin ich zu blind um eine Lösung mittels SELECT zu generieren?
 
Ist gneau richtig normalisiert

Du kannst die Auswahl ganz normal machen. Dann Gruppieren auf das Bild und Zählen ob die Anzahl Treffer auch stimmt.

Als Beispiel mit den Suchbegriffen Anbau, Kompressor, Edelstahl -> Ergo 3 Begriffe
SQL:
SELECT
	b.id,
	b.bildpfad,
	b.bildbeschreibung,
	GROUP_CONCAT(t.tagname SEPARATOR ', ') AS tags
FROM
	bilder AS b
	INNER JOIN xbildertags AS x ON b.bildid = x.xbildid
	INNER JOIN bildertags AS t ON x.xtagid = t.tagid
WHERE
	--Kann auch über ein normales OR gelöst werden
	FIND_IN_SET(t.tagname, 'Anbau,Kompressor,Edelstahl'
GROUP BY
	b.id
HAVING
	COUNT(DISITNCT tagid) = 3

Das ganze ist natürlich ungetestet....
 
Zuletzt bearbeitet von einem Moderator:
Hallo yaslaw,

funktioniert einwandfrei. Das einzige was er angemeckert hat war das Find_in_set, habe das durch OR Argumente ersetzt, hat dann funktioniert. Tadellos! Darf ich Dich MySQL-Gott nennen ;-)

Gruß

Tribal
 

Neue Beiträge

Zurück