Hallo,
ich habe jetzt schon viele Google-Ergebnisse abgeklappert, finde aber leider keine Lösung. Vielleicht könnt ihr mir weiterhelfen:
Es existieren drei Tabellen, die für die Suche zuständig sind:
- search_items: Enthält die Artikel, die durchsucht werden können
- search_keywords: Enthält alle Stichwörter, die aus den Artikeln gesammelt wurden
- search_item_keyword:: Verknüpft Artikel mit Stichwörter, gibt also an, welche Stichwörter in welchem Artikel vorhanden sind.
Ich bin schon so weit, dass ich aus einer Suchanfrage (z.B. "Herbst Buch") Stichwörter herauslesen kann (Herbst|Herbstlich + Kochbuch|Buchhaltung). Ein Artikel muss also gefunden werden, wenn er z.B. "Herbst" und "Buchhaltung", oder auch "Herbstlich" und "Kochbuch" enthält. Oder-Verknüpfungen sind also innerhalb der Und-Verknüpfungen geschachtelt.
Jetzt dachte ich, ich könnte das Problem mittels Joins lösen:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7:
| SELECT * FROM search_items INNER JOIN search_item_keyword ON search_item_keyword.item_id = search_items.item_id AND (keyword_id = 'Herbst' OR keyword_id = 'Herbstlich') INNER JOIN search_item_keyword ON search_item_keyword.item_id = search_items.item_id AND (keyword_id = 'Kochbuch' OR keyword_id = 'Buchhaltung') |
(Die Werte für
keyword_id sind hier nur symbolisch zu verstehen.)
Dabei würde für jeden Artikel geprüft werden, ob es eine Verknüpfung mit einem der zur Auswahl stehenden Keywords gibt. Das klappt soweit auch ganz gut.
Wenn ein Artikel jetzt aber sowohl "Kochbuch" als auch "Buchhaltung" enthält, wird er zweimal aufgelistet. Das ist ein ernsthaftes Problem, denn um die Gesamtzahl der Treffer zu ermitteln muss die komplette Query in SQL formuliert werden und die Ergebnisse können nicht per PHP bearbeitet werden.
Jetzt meine Frage: Ist es möglich, Joins nur zur "Überprüfung, ob ein bestimmter Datensatz vorhanden ist" zu verwenden, ohne dabei für jeden gefundenen Datensatz eine Reihe im Ergebnis einzufügen?
Danke für eure Mühe!
Grüße,
Yogu