Andreas-Lindig: unvorhersehbare UND-Verknüpfung zwischen verschiedenen Spalten

Hallo Forum,

Ich überarbeite gerade meine Forums-Suche und stoße da auf folgendes Problem: ganz zu Anfang soll es ein einfaches Eingabefeld geben in das man ein oder mehrere Wörter eingeben kann. Ich will nun die Option anbieten, daß _alle_ Wörter im Beitrag vorkommen sollen. Da dieser erste Suchschritt aber so einfach und global wie möglich sein soll, können die sowohl alle zusammen z.B. im Inhalt oder im Namen vorkommen, als auch verteilt, z.B. Wort1 im  Namen, Wort2 und Wort3 im Inhalt. Es sollen aber immer _alle_ in einem Posting vorkommen, da ich eine echte ODER-Suche ziemlich Banane finde. Eine Suche soll schließlich eingrenzen und nicht möglichst viele Treffer raushauen. Wenn der Patient unbedingt ODER suchen will, kann er auch zwei Suchvorgänge nacheinander starten.

So: nun ist die Frage, wie packe ich das in eine Abfrage. Es kommen also vom Formular zum Beispiel drei Suchwörter an. Sie wurden schon getrennt und und in ein Array gepackt. Und nun?

gegeben seien 3 Suchwörter: [1], [2], [3] und gesucht werden soll in drei Tabellenspalten: Name, Thema, Inhalt.

|  Szene1   | Szene2 | Szene3 | Szene4 | Szene5 |
---------------------------------------------------------
Name:   | [1][2][3] | [1][2] | [1][3] | [2][3] |  [1]   |

Thema:  |           | [3]    | [2]    | [1]    |  [2]   |

Inhalt: |           |        |        |        |  [3]   |
---------------------------------------------------------
Anzahl  |    3x     |  3*2x  |  3*2x  |  3*2x  | 3*2*1x |

Also:

in Szene1 kommenen alle drei Suchwörter im Namen vor. Sie könnten genauso zusammen im Thema oder im Inhalt vokommen - 3 Möglilchkeiten.

in Szene2 kommen im Namen zwei Suchwörter vor, das dritte im Thema. Die zwei Wörter aus Name könnten genauso in allen drei Rubriken auftauchen und das jeweils letzte Wort in einer der anderen beiden Rubriken - 3*2 Möglichkeiten

in Szene3 kommen zwei andere Suchwörter zusammen vor und das dritte woanders...

so kann man die Tabelle weiterlesen. Ich komme auf 27 Möglichkeiten, die ich ja alle in der SQL-Abfrage unterbringen müßte. Bei 4 Suchwörtern wären es schon 81 Möglichkeiten.

Also zum Beispiel:

SELECT * from tabelle
WHERE
(
      Name = [1]
      AND
      Name = [2]
      AND
      Name = [3]
)
OR
(
      Name = [1]
      AND
      Name = [2]
      AND
      Thema= [3]
)
OR...

Das kommt mir etwas umständlich vor. Ich habe schon an match() über drei Spalten gedacht, aber da wird ja nur mit einer ODER-Verbindung gesucht, es müssen also nicht alle Wörter vokommen.

Gruß, Andreas

  1. Hallo,
    Ich versteh dein problem nicht ganz, hast du ein suchformular das für jedes feld das du durchsuchen willst ein input darstellt ?

    oder hast du ein input feld das in den feldern suchen soll ?

    Sucheingabe war "str rts"

    SELECT DISTINCT * FROM table WHERE (
     (feld1='str' OR feld2='str' OR feld3='str') AND
     (feld1='rts' OR feld2='rts' OR feld3='rts')
    )

    Somit solltest du alle fälle erledigt haben. Es sollten nur posts gefunden werden die in einem der felder str UND rts enthalten. (wo ist dabei egal)

    Du musst mit deiner Programmiersprache halt vorher den suchstring in einzelne worte teilen und dann über schleifen den query wie oben gezeigt aufbaun.

    Ludwig

  2. hi andreas,

    ich beziehe mich einfach mal nur auf die WHERE bedingung, auf die kommt es dir ja an. so wie es für mich auf den ersten blick aussieht, musst die Bedingung dynamisch erzeugen, sprich sie ist abhängig von der anzahl der wörter, die zu suchen sind. Ich werde versuchen, es genauer zu erklären...

    gehen wir erst einmal von den einfachsten fall aus, dass du nur ein wort zu überprüfen hast. du suchst dann in den drei bereichen name, thema und inhalt, die mit logischen ODER verknüpft sind. es reicht also (umgangssprachlich):

    (wort[1] in name) OR (wort[1] in thema) OR (wort[1] inhalt)

    so weit so gut. komme jetzt ein weiteres wort hinzu, musst du auch für dieses wieder die drei bereiche mit ODER verknüpfen sprich:
     (wort[2] in name) OR (wort[2] in thema) OR (wort[2] inhalt)

    anschließend mußt du beide bereiche mit UND logisch verbinden. für jedes weitere suchwort kommt einen weiteres sgement dazu:

    ((wort[1] in name) OR (wort[1] in thema) OR (wort[1] inhalt)) AND ((wort[2] in name) OR (wort[2] in thema) OR (wort[2] inhalt)) AND
    .
    .
    .
    (wort[x] in name) OR (wort[x] in thema) OR (wort[x] inhalt)

    mit andere worten deine SELECT abfrage muss abhängig von der anzahl der wörter dynamisch erzeugt werden. noch ein kleiner hinweis. du solltest mit LIKE arbeiten. bin mir nicht sicher, ob ich dein problem damit erkannt habe.

    Ilja

  3. Hallo Ihr beiden,

    vielen Dank. Eure Lösungsansätze sind ja im Prinzip gleich. Ich muß also nur in der WHERE-Klausel die Reihung der UND/ODER Verbindungen tauschen und schon kann ich die Abfrage dynamisch generieren. So einfach kann die Welt sein ;)
    Ist aber nicht immer so - wenn man z.B. rechts und links verwechselt... ohoh ;)

    Gruß, Andreas