Zwei Suchworte mit AND verknüpfen

dki

Mitglied
Hi,

ich hab mal wieder ein kleines Problem.
Ich beschreib erstmal die Tabellen, um dann auf das Problem einzugehen.
Ich habe 3 Tabellen:
1. Tabelle Daten:
datenID
datum
und weitere einträge die man finden möchte

2. Tabelle zwischenTabelle Daten_Tags
datenID
tagID

3. Tabelle Tags
tagID
tag

Ich möchte gerne jetzt alle Daten haben, die 2 Suchtags beinhalten. Also wenn man nach "Haus" und "Hof" sucht, dass nur die Daten zurück kommen die den tag "Haus" UND "Hof" haben.

Meine jetztige Lösung ist nicht gerade schön:

Code:
SELECT * FROM DATEN WHERE datenID IN (SELECT datenID WHERE Daten_Tags dt JOIN Tags t ON dt.tagID=t.tagID WHERE tag='Haus') AND datenID IN (SELECT datenID WHERE Daten_Tags dt JOIN Tags t ON dt.tagID=t.tagID WHERE tag='Hof') ORDER BY datum ASC LIMIT 16 OFFSET 0

Diese Abfrage braucht sehr lang, wenn sehr wenig gefunden wird.

Ich hoffe ich habe irgendwas übersehen.
Danke schonmal.

Gruß
dki
 
Versuch mal ein 'exists' statt 'in' zu verwenden.
Wenn viele Daten durchsucht werden müssen, ist das 'in' meist langsamer.

Am besten ists wenn du gar kein sub-select machen musst, sondern einen normalen join verwenden kannst. Versuch das Statement auf verschiedene Arten umzuschreiben.
 
Danke.

Das Joinen ist wirklich effektiver.

Komischerweise war ich fest überzeugt, dass ich in der Dokumentation von MySQL gelesen habe, das solche Konstrukte (Subqueries mit IN) schneller wären als JOIN.
Gerade nochmal gegooglet und auf der MySQL Seite gerade das gegenteil gelesen...
 
Zurück