Marc Reichelt: Danke & Problemlösung

Beitrag lesen

Hallo dedlfix,

Wenn du nach mehreren Begriffen, die in einer Spalte vorkommen können sollen, suchen möchtest bietet sich IN an: WHERE artist IN ('begriff1','begriff2','begriff3') OR song IN ('begriff1',...). Diese Liste empfiehlt sich mit PHP zusammenbauen, da sie beliebig viele Werte enthalten kann und eine Auswertung mit SQL-Syntax wenn überhaupt dann nur sehr aufwändig zu realisieren wäre.

Den Suchstring bastel ich auf jeden Fall mit PHP zusammen, das ist klar. :-)

Doch leider möchtest du sicher nicht nur nach ganzen Wörtern sondern auch nach teilweisen Vorkommen suchen. "Hosen" sollen auch in "Die Toten Hosen" gefunden werden. Damit brauchst du ein LIKE: WHERE artist LIKE '%hosen%'. Und solch eine Bedingung müsstest du für jeden Suchbegriff und für beide Spalten an das Statement mit PHPs Hilfe anhängen. Eine Verknüpfung mit LIKE IN gibt es nicht.

Schade, auf so eine Möglichkeit habe ich insgeheim gehofft.
Nun denn, dann bastel ich mir das Ganze mit PHP zusammen - ausgeführt wird es aber ja immer noch via MySQL.

Was gibt es noch? Reguläre Ausdrücke mit REGEXP/RLIKE. Regexp kennt eine Oder-Verknüpfung, und damit sieht eine Lösung so aus: WHERE artist RLIKE 'begriff1|begriff2|begriff3' OR song RLIKE ...

Hmm, da gefällt mir die Variante LIKE "%hosen%" besser, denn reguläre Ausdrücke brauchen mehr Zeit und ich benötige sie in meinem konkreten Fall nicht. Und die Oder-Verknüpfungen mache ich dann ganz einfach mit MySQL.

Jetzt aber mein Problem, nochmals zum Ausgangsbeispiel zurück:
WHERE
  (artist LIKE "%Hosen%" AND artist LIKE "%Sehnsucht%") OR
  (song LIKE "%Hosen%" AND song LIKE "%Sehnsucht%")

liefert mir _nicht_ das Ergebnis "Die Toten Hosen - Ich Bin Die Sehnsucht In Dir".
Warum? Ganz einfach - in "Die Toten Hosen" steckt zwar das Wort "Hosen", aber nicht das Wort "Sehnsucht". Umgekehrt steckt im Songnamen nur das Wort "Sehnsucht" drin.

Eine solche Suche möchte ich nicht, da ich damit unter anderem alle Lieder der Toten Hosen bekomme, obwohl der Suchbegriff "Sehnsucht" mit gemeint ist.

Wahrscheinlich müsste ich es dann eher so aufbauen:
WHERE
 (artist LIKE "%Hosen%" OR song LIKE "%Hosen%") AND
 (artist LIKE "%Sehnsucht%" OR song LIKE "%Sehnsucht%")

Und vor solchen Konstrukten wollte ich weg, da ich dachte dass es in MySQL vielleicht so etwas wie eine kurzfristige Verknüpfung mehrerer Spalten gibt.
So etwas meinte ich (funktioniert natürlich nicht):
WHERE artist+song LIKE "%Hosen%" AND artist+song LIKE "%Sehnsucht%"

Aber verwenden tue ich nun die obrige Lösung.

[REGEXP]
Vorher solltest du noch alle nicht-alphanumerischen Zeichen aus $suche verbannen, sonst wirft dir im besten Falle MySQL eine Fehlermeldung zu.

Wie gesagt, reguläre Ausdrücke müssen nicht unbedingt sein, das Escapen von zwei Zeichen bei LIKE (% und _) genügt mir vollkommen.

Grüße & vielen Dank für die Antworten

Marc Reichelt || http://www.marcreichelt.de/

--
Linux is like a wigwam - no windows, no gates and an Apache inside!
Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
http://emmanuel.dammerer.at/selfcode.html