Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

("Bedingte") SQL-Abfrage

wlaner / 6 Antworten / Baumansicht Nickles

Aaaalso, des ist jetzt vllt. ein bisschen schwer verständlich, aber ich hoff man versteht ansatzweise, was ich machen will. :-)

Es geht um eine Suchfunktion. Die Suche ist zum Beispiel "alles klar". Per PHP wird der String "exploded" und in Teilstrings eingeteilt.
Der Query dazu:

mysql_query("SELECT * FROM tab WHERE feld LIKE '%$Explode[0]%'
OR feld LIKE '%$Explode[1]%'")


Das Problem ist, dass ich nicht davon ausgehen kann, dass das Suchwort aus 2 Teilwörtern besteht, d.h. wenn das Suchwort anstatt "alles klar" "alles" ist, dann wär $Explode[1] leer, was zu einem Vergleich feld LIKE '%%' führt und somit alles selectiert.

Ich bräuchte so ne Art if-Anweisung im Query, hab da schon ein bisschen rumprobiert, is aber nix rausgekommen.
Wie ist das ganze mittels PHP lösbar? Oder gibts da was seitens SQL?

WL

bei Antwort benachrichtigen
Borlander wlaner „("Bedingte") SQL-Abfrage“
Optionen
Wie ist das ganze mittels PHP lösbar? Oder gibts da was seitens SQL?
Muß Du in PHP machen, zumal Du die Abfrage auch noch umbedingt unter allen Umständen Escapen solltest. Stichwort SQL-Injections.

Einfach das Array durchlaufen, für jeden Eintrag die nötige Abfrage generieren und anschließend zusammenbasteln:
$where_feld = array();
foreach($Explode as $word) {
  $where_feld[]= 'feld LIKE "%'.mysql_real_escape_string($word, $db_connection).'%"';
}
$where = count($where_feld)
  ? 'WHERE '.implode(' OR ', $where_feld)
  : '';
$query = 'SELECT * FROM tab '.$where



Gruß
Borlander
bei Antwort benachrichtigen
wlaner Borlander „ Muß Du in PHP machen, zumal Du die Abfrage auch noch umbedingt unter allen...“
Optionen

Ohh, den Inhalt des Querys ausserhalb zu generieren ist mir natürlich nicht eingefallen :-(
Das kommt davon wenn man überstürzt postet :-P

Vielen Dank :-)

PS: SQL-Injections beachte ich natürlich

bei Antwort benachrichtigen
xafford wlaner „("Bedingte") SQL-Abfrage“
Optionen

Wenn DU als Tabellentyp MyISAM nutzt, dann kannst Du auf die zu durchsuchenden Felder einen FULLTEXT-Index legen, dann geht die Suche auch mit:

SELECT * MATCH(`feld`) AGAINST ('Hier stehen die einzelnen Worte der Suche') FROM `tab`

Bei einer Fulltext-Suche sucht MySQL nach den einzelnen Worten der Suchanfrage. Wenn nach Relevanz gesucht werden soll geht es auch als:

SELECT * FROM `tab` WHERE MATCH (`feld`) AGAINST ('Hier stehen die einzelnen Worte der Suche')

Eines sollte Dir allerdings klar sein: Einfügeoperationen in diese Datenbank werden wesentlich langsamer durch FULLTEXT-Indices.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen
wlaner xafford „Wenn DU als Tabellentyp MyISAM nutzt, dann kannst Du auf die zu durchsuchenden...“
Optionen

Danke für den Tipp!
Werds bei Gelegenheit mal testen. Wenn Einfügeoperationen allerdings deutlich länger dauern sollten, dann fällt die Möglichkeit aus, weil die Tabelle ständig (userseitig) geändert bzw. ergänzt wird.

WL

bei Antwort benachrichtigen
Borlander wlaner „Danke für den Tipp! Werds bei Gelegenheit mal testen. Wenn Einfügeoperationen...“
Optionen

Wobei Suchen mit LIKE "%Suchbegriff" auch verdammt langsam/teuer sind, da in jedem Fall ein Full-Table-Scan nötig ist zum ermitteln der Ergebnismenge...

Gruß
Borlander

bei Antwort benachrichtigen
xafford wlaner „Danke für den Tipp! Werds bei Gelegenheit mal testen. Wenn Einfügeoperationen...“
Optionen

Hm, as "wesentlich langsamer" ist natürlich relativ zu sehen, das bedeutet nicht, dass deine ganze Anwendung dadurch bei Einfügeoperationen still steht, es bedeutet nur, dass es wesentlich langsamer ist, als ohne FULLTEXT-Index,was letztendlich für alle Indices gilt da diese für jeden neuen Datensatz aktualisiert werden. Dies ist bei einem FULLTEXT nur eben etwas teurer.

Wenn Du also keine Anwendung hast, die pro Sekunde mehrere gleichzeitige Nutzer hat, so brauchst Du Dir um die Geschwindigkeit nicht wirklich sorgen zu machen, zumindest nicht wegen des FULLTEXT. Zudem hat Borlander Recht mit der sehr ineffektiven Suche mit LIKE.

Pauschalurteile sind immer falsch!!!
bei Antwort benachrichtigen