Suchfunktion für mySQL Datenbank
Alex
- php
Hallo!
Ich möchte mir gerade eine kleine Suchfunktion machen, um nach Daten zu suchen, die in einer mySQL-Datenbank ligen. Es wird also über ein Formular ein Suchbegriff eingegeben, dann wird die Datenbank wie folgt abgefragt:
$result = mysql_query("SELECT * FROM Tabelle WHERE Spalte LIKE '%$Suchbegriff%'");
Das funktioniert soweit auch wunderbar und irgendwie bin ich erstaunt wie einfach das soweit ging :-) ...
Jetzt stehe ich aber auf dem Schlauch:
Es können ja auch mehrere Suchbegriffe eingegeben werden, dann sind die Suchergebnisse natürlich nur Daten, die den Text in der eingegebenen Reihenfolge enthalten. Also spalte ich $Suchbegriff mit $Suchbegriff_Array = explode(" ", $Suchbegriff) auf.
Aber nun???
Wie formuliere ich die Datenbankabfrage so, dass alle $Suchbegriff_Arrays berücksichtigt werden (AND) bzw. mindesten einer (OR)?
Kann mir jemand einen Tipp geben?
Schon mal danke, Grüße und einen schönen Sonntag: Alex
$result = mysql_query("SELECT * FROM Tabelle WHERE Spalte LIKE '%$Suchbegriff%'");
Es können ja auch mehrere Suchbegriffe eingegeben werden, dann sind die Suchergebnisse natürlich nur Daten, die den Text in der eingegebenen Reihenfolge enthalten. Also spalte ich $Suchbegriff mit $Suchbegriff_Array = explode(" ", $Suchbegriff) auf.
Aber nun???
Wie formuliere ich die Datenbankabfrage so, dass alle $Suchbegriff_Arrays berücksichtigt werden (AND) bzw. mindesten einer (OR)?
SELECT * FROM Tabelle WHERE Spalte LIKE '%$SuchbegriffA%'" AND Spalte LIKE '%$SuchbegriffB%'" AND Spalte LIKE '%$SuchbegriffC%'" usw.
MySQL bietet mit REGEXP auch die Möglichkeit, Reguläre Ausdrücke zu verwenden. Ein Blick in die MySQL-Anleitung (unter SELECT) hilft Dir weiter.
Gruß,
soenk.e
Moin!
Jetzt stehe ich aber auf dem Schlauch:
Es können ja auch mehrere Suchbegriffe eingegeben werden, dann sind die Suchergebnisse natürlich nur Daten, die den Text in der eingegebenen Reihenfolge enthalten. Also spalte ich $Suchbegriff mit $Suchbegriff_Array = explode(" ", $Suchbegriff) auf.
Aber nun???
Wie formuliere ich die Datenbankabfrage so, dass alle $Suchbegriff_Arrays berücksichtigt werden (AND) bzw. mindesten einer (OR)?
Für AND oder OR mußt du dich irgendwie vorher entschieden haben (oder den User fragen). Dann bastelst du einfach den Suchstring neu zusammen:
$suchbegriff="spalte LIKE '%".implode("%' AND spalte LIKE '%",$Suchbegriffe_Array)."%'";
IMPLODE setzt das Array zu einem neuen String zusammen und fügt dabei den Trennstring ein:
xxxxx = Arrayelement
TTTTT = Trennstring
xxxxxTTTTTxxxxxTTTTTxxxxxTTTTTxxxxx
Laß dir einfach das Ergebnis per Echo ausgeben und guck ihn dir an. Der Rest besteht nur noch darin, vorne und hinten die passenden Reststrings zu platzieren.
- Sven Rautenberg
Hallo!
Wow, das ist eine echt gute, simple Idee! Habe mich schon mit den irrsinnigsten Schleifen rumgeschlagen - aber warum kompliziert, wenn's auch einfach geht!
Vielen Dank & Grüße: Alex
Nochmal hallo!
Jetzt hätte ich noch mal ein Problemchen dazu:
Kann man irgendwie auch mehrere Spalten zusammenfassen, also etwa so:
SELECT * FROM Tabelle WHERE (Spalte1 + Spalte2) LIKE '%hund%' AND (Spalte1 + Spalte2) LIKE '%katze%' ?
...also es soll "hund" und "katze" entweder in Spalte1 oder in Spalte2 vorkommen.
Alles klar???
Wäre noch mal sehr dankbar für einen Tipp!
Grüße: Alex
Huhu Alex
ja, das kann man mit concat(spalte1,spalte2) oder concat_ws(' ',spalte1,spalte2) machen.
Mit concat_ws kann man verhindern, dass wenn z.b. in spalte1
"Ein Tusch"
und in spalte2
"und hier gleich noch einer"
Die Suche nach "hund" auf diesen Datensatz anspricht.
Viele Grüße
lulu
Hi!
Mal was anderes, ich hatte diese Frage hier auch schonmal gestellt, da wurde mir gesagt, das die Suche mit like nicht gerade als performant bezeichnet werden kann, gerade bei größeren Datenmengen ist das schlecht. Vor allem bietet mysql selbst eine sehr gute Möglichkeit für die Volltextsuche:
http://www.mysql.com/doc/F/u/Fulltext_Search.html
Viele Grüße
Andreas