MySQL Suche!

Status
Nicht offen für weitere Antworten.

firstlord18

Erfahrenes Mitglied
Hallo,

ich möchte eine einfache Suche:

ich habe ein Table mit 3 Spalten: id, vorname, nachname

Nun möchte ich, dass die Leute auf meiner Seite diesen Table (mss_user( durchsuchen können.

Da ich nicht weiß, wie viele Namensteil und in welcher Reihenfolge sie die Daten eingeben (Vorname Nachname oder andersrum), weiß ich nicht genau, wie ich die Suche machen soll...

ich habe es versucht, mit der MySQL Fulltext Suche:
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

Leider steht am Ende:
Such a technique works best with large collections (in fact, it was carefully tuned this way). For very small tables, word distribution does not adequately reflect their semantic value, and this model may sometimes produce bizarre results. For example, although the word MySQL is present in every row of the articles table, a search for the word produces no results:

Das habe ich auch bei folgendem Code gemerkt:

PHP:
 function search_person($name) {
 	$sql = "SELECT 
 				id, nachname, vorname, 
 			MATCH (vorname, nachname) AGAINST ('".$name."') AS score
 			FROM mss_user
 			WHERE MATCH (vorname, nachname) AGAINST ('".$name."')";
 	$res = mysql_query($sql) or die(mysql_error());
 	$array = array();
 	while($row = mysql_fetch_assoc($res)) {
 		$array[] = $row;
 	}
 	return $array;
 
 }

wenn ich nun noch dazufüge " IN BOOLEAN MODE", wie auf der ächsten Seite des Manuals beschrieben, dann findet er bei oberem Code nurnoch jeweils eine Spalte.

Also angenommen mehrere Spalten wären betroffen mit je einem Treffer in Vorname oder Nachname, dann wird nurnoch einer dieser Name ausgegeben!

Wie könnte ich eine Suche meiner Art am besten realisieren?

Danke!
 
Jetzt habe ich das schon so schön beschrieben, und sogar meinen eigenen Ansatz gepostet. Auf Groß und Kleinschreibung geachtet, und bekomme bei solch einem intererssanten Thema trotzdem keine Antwort :(
 
Vielleicht war die Uhrzeit zu der Du gepostet hast auch nur etwas unguenstig.

Und haettest Du nicht auf Gross- und Kleinschreibung geachtet haette ich Dir heute morgen bei meinem Rundumschlag auch eine Nachricht hinterlassen. ;)

Nun zum Thema:
Du nutzt einige SQL-Anweisungen mit denen ich selbst noch nicht gearbeitet hab, daher kann ich dazu nicht viel sagen.
Aber wenn Du eine Liste hast die mit einem Wert in der DB verglichen werden sollen wuerde ich das ueber IN probieren.
Das Problem dabei ist, dass Du die einzelnen Werte trennen musst.
Sagen wir mal:
PHP:
$suchtext="Ernst Uwe Huebner";
Jetzt willst Du diesen String mit den Feldern fuer Vor- und Nachnamen (getrennt in der DB gespeichert) vergleichen.
Normalerweise wuerdest Du ja den SQL-Query so gestalten:
PHP:
$sql="SELECT * FROM users WHERE vorname='$suchtext' OR nachname='$suchtext'";
Dass dies bei dem String wenig Sinn macht ist klar.
Daher wuerde ich die einzelnen Worte im String durch ',' trennen.
Das koenntest Du so machen:
PHP:
$suchtext=str_replace(" ","','",$suchtext);
$suchtext sollte nun folgenden Inhalt haben:
PHP:
Ernst','Uwe','Huebner
Diesen String kannst Du nun wunderbar mit IN nutzen. Und zwar so:
PHP:
$sql="SELECT * FROM users WHERE vorname IN '$suchtext' OR nachname IN '$suchtext'";
Es wird nun sowohl fuer vorname als auch fuer nachname geprueft ob der dort enthaltene Wert einem der Werte im String entspricht.
 
Danke erstmal. Leider kommt immer der selbe Fehler:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Björn','Nachname' OR nachname IN 'Björn','Nachname'' at line 6

auch, wenn ich nur einen Name eingebe, also z.b. nur Björn!

Es auch nicht, wenn ich statt

PHP:
  $sql="	SELECT 
  				id, vorname, nachname
  			FROM 
  				mss_user 
  			WHERE 
  				vorname IN '$suchtext' 
  				OR 
  				nachname IN '$suchtext' ";

schreibe:

PHP:
  $sql="	SELECT 
  				id, vorname, nachname
  			FROM 
  				mss_user 
  			WHERE 
  				vorname IN '".$suchtext."' 
  				OR 
  				nachname IN '".$suchtext."' ";


EDIT: die Argumente von IN müssen in Runde Klammern, klappt nun super :) Danke!
 
phillipcool hat gesagt.:
Hallo,

wie muss das? In Rundeklammern?
Kann man eben jemand Code posten? Ich verstehe das nicht. :(
hier:

PHP:
 $sql="	SELECT 
				  id, vorname, nachname
			  FROM 
				  mss_user 
			  WHERE 
				  vorname IN ('".$suchtext."') 
				  OR 
				  nachname IN ('".$suchtext."') ";
</font></font>
 
@Dennis Wronka:
nochmal vielen Dank.
Ich habe nur einen Nachteil gefunden.
Da es nur 2 Spalten sind, die durchsucht werden sollen, werden nicht mehr als 2 Ergebnisse zurückgegeben.

Angenommen ich habe folgende Tabellen-Struktur:

Code:
    nachname   ,	vorname
    vorname	 test
    bla 		    jaaa
und ich führe nun den query mit folgendem Suchestring aus:

$suchstring = "jaaa vorname spiegel";

werden nur 2 Leute selected anstatt 3!

Etwas blöd.

Könnte man das denn auch irgendwie anders meistern!
 
Erstmal zu den fehlenden Klammern: Sorry, das hatte ich ganz vergessen. Nutze IN auch nur in 1 oder 2 Scripts. ;)

Zu den unzureichenden Suchergebnissen: Ich probier mal ein wenig rum und guck ob ich da was finde.

Also bei mir funktioniert es so wunderbar.
Der Suchstring sieht bei mir so aus:
PHP:
$namen="Hans','Ernst','Hager";

Das ist das SQL-Statement:
PHP:
$sql="select * from users where vorname in ('$namen') or nachname in ('$namen')";

Aus der Datenbank kommen dabei:
Hans Wurst
Ernst Haft
Harry Hager
 
Ah mir ist grad was aufgefallen:

ich hatte das vorhin falsch getestet! Wenn ich die jeweiligen Namen richtig eingebe, dann klapp es wunderbar. Wenn ich jedoch in der Tabelle vielen Nachname á la nachname1, nachnam2, nachname3, nachname4, ..., nachname 20 habe, und als Suchstring nachname eingebe, es leider nicht!

Kann man da eventuell diese IN Abfrage mit einer Like Abrfage verknüpfen?
 
Status
Nicht offen für weitere Antworten.
Zurück