Markus Möller: (SQL) Verwandte Themen finden

Beitrag lesen

Hallo zusammen,

ich habe folgendes Problem. Eine Tabelle enthält Themen, die 10 Tags besitzen. In etwa so (stark gekürzt).

CREATE tbl_topics (
   id INT,
   title VARCHAR(255),
   tag1 VARCHAR(255),
   tag2 VARCHAR(255),
   tag3 VARCHAR(255)
)

Wie finde ich nun zu einen Thema alle andere Themen, die mindestens zwei gemeinsame Tags besitzen? Die Tags sind nicht sortiert und können auch NULL sein.

Erster Ansatz:
Per PHP alle Tags des Themas zu einem kommaseparierten String zusammenbauen und verwandte Themen dann so suchen:

SELECT * FROM tbl_topics WHERE tag1 IN ($tags) OR tag2 IN ($tags) OR tag3 IN ($tags)

Das funktioniert super, wenn eine Übereinstimmung nötig ist. Ich möchte ein Thema aber nur als verwandt anzeigen, wenn mind. 2 Tags übereinstimmen. Später vielleicht erst ab 4, 5, ...

Die Lösung sollte also auch leicht erweiterbar sein und natürlich recht performant sein.

Ich bin mir sicher, dass es eine einfache Lösung mit count, join, having etc. gibt, stehe aber total auf dem Schlauch. Wer kann helfen?