[SQL/PHP] - Komplizierte Suche...



  • Hallo Zusammen

    Ich habe ein Problem und komme nicht weiter.

    SELECT * FROM tabelle WHERE stelle LIKE %suchwort%
    

    Diese Zeile sucht in der Tabelle "tabelle" in der Spalte "stelle" alle Zeilen durch wo "suchwort" steht und gibt diese dann aus. Soweit alles klar.

    Nun wie mache ich das jetzt, dass bei WHERE 2 faktoren stimmen müssen?? Ich habe folgende Zeilen:

    ID ¦ KAT ¦ GRUPPE ¦ STATUS ¦ TEXT
    1 ¦ Eins ¦ Jugend ¦ Privat ¦ Hallo Welt
    2 ¦ Eins ¦ Jugend ¦ Weltweit ¦ Text Hello
    3 ¦ Drei ¦ Jugend ¦ Privat ¦ Hallo Welt
    4 ¦ Eins ¦ Erwachs ¦ Privat ¦ Hallo Welt

    Gemäss Formular wird die Kategorie und die Gruppe gewählt. Wenn jemand nun Kategorie Eins und Gruppe Jugend wählt, dann soll NUR dort gesucht werden wo Kategorie eins und gruppe jugend ist. Aber die ganze zeile.

    Das suchwort in diesem Beispiel ist welt.
    Bei ID 1 und 4 wird alles ausgeben, da dort Katgorie und Gruppe stimmen und auch das wort "welt" vorkommt.

    ID 2 müsste aber auch ausgegeben werden, weil es dort stimmt und welt bei status vorkommt!

    3 und 4 nicht, da Kategroie und Gruppe nicht stimmen, obwohl welt in der zeile vorkommt. Wie mache ich das ??

    Anders gesagt möchte ich:
    SQL soll nur suchen wenn KAT und GRUPPE übereinstimmen und dies aber in der ganzen tabelle, über all wo es stimmt. und zwar in der GANZEN Zeile, egal ob das suchwort bei ID oder status steht, soll auch dann das ergbenis sein.

    Wie geht das ?? also mit folgendem Code komme ich nicht weiter:

    SELECT * FROM tabelle WEHERE kategorie=eins AND gruppe=Jugend LIKE %welt%
    

    Das geht nicht! Wie stelle ich dass dan sonst an?

    lg
    Wolf



  • Also bin nicht sicher ob ich verstanden hab was du willst aber eventuell ist

    SELECT * FROM tabelle WHERE (kategorie='eins') AND (gruppe='Jugend') AND (Text LIKE '%welt%')
    

    ja was du suchst.



  • select * sollte man vermeiden... siehe hierzu: http://www.php-faq.de/q/q-sql-select.html

    SELECT id, status, text
      FROM tabelle
      WHERE kat = 'eins'
        AND gruppe = 'jugend'
        AND status LIKE '%welt%'
        AND text LIKE '%welt%'
    

    außerdem könntest du dein Tabellenlayout etwas umbauen...

    2 zusätzliche Tabellen `kat` und `gruppe` anlegen, wo du die entsprechenden Bezeichnugen ablegst... in deiner Haupttabelle fügst du nur die entsprechende ID als integer ein... Vorteil: Integer lassen sich leichter durchsuchen und dein Formular kannst du dann auf Basis dieser beiden Hilfstabellen aufbauen (wobei die ID der Combobox der ID in der Datenbank entspricht). Dadurch wird dein Query kleiner, die Bezeichnungen lassen sich einfach nachträglich ändern (auch mehrsprachig wäre dann möglich) und du sparst im Endeffekt Platz.
    Das aber nur so als Gedanke...



  • Danke. Genau das habe ich gseucht und bin gestern leider schon von selbst darauf gekommen.

    Mich hat eben das dritte AND verwirrt...

    Thx



  • So wie zwutz es geschrieben hat ist es nicht nur eine Gedanke sondern man nennt es normalisieren.
    Also normalisiere mal deine Tabellen.
    Was das genau ist findest Du im INET genug. Eigentlich sollte man fast immer bis zur 3 Form normalisieren obwohl es noch mehr Formen gibt.
    Ob mehr Sinn macht kommt immer auf den Anwendungsfall an.

    Weiters solltes Du schauen ob deine DB nicht eine Volltextsuche bietet.


Anmelden zum Antworten