Frage zu MYSQL Abfrage

nchristoph

Erfahrenes Mitglied
Ich hab eine Frage zu einer Suchabfrage in MYSQL:

Wie kann ich ein WHERE Statement so umschreiben, das mehrere Suchbegriffe in einer Zeile durchsucht werden können?

Meine momentane Abfrage schaut wie folgt aus:

PHP:
$sql = "SELECT
				ID,
                Holzart,
				Klasse,
				Trockenheit,
				Partie,
				Kubik,
				Starke,
				Pfad
            FROM
                suchmaschine
            WHERE
                Holzart LIKE '%" . mysql_real_escape_string(utf8_decode($_POST['suchbegriff'])) . "%' OR
				Klasse LIKE '%" . mysql_real_escape_string(utf8_decode($_POST['suchbegriff'])) . "%' OR
				Trockenheit LIKE '%" . mysql_real_escape_string(utf8_decode($_POST['suchbegriff'])) . "%' OR
				Partie LIKE '%" . mysql_real_escape_string(utf8_decode($_POST['suchbegriff'])) . "%' OR
				Kubik LIKE '%" . mysql_real_escape_string(utf8_decode($_POST['suchbegriff'])) . "%' OR
				Starke LIKE '%" . mysql_real_escape_string(utf8_decode($_POST['suchbegriff'])) . "%'";

Ich will aber das ich eingeben kann: Esche 70 mm 1 KL.

Momentan wirft er, sobald ich nach Esche ein Leerzeichen mache, schon die Meldung aus: Die Suche hat keine Treffer ergeben.

Wie muss ich die umschreiben, damit das wie beschrieben funktioniert?

mfg
 
Zuletzt bearbeitet:
Zeig mir mal bitte Beispielsweise die Ausgabe von $sql.
Also
PHP:
echo $sql;
. Dann sehen wir ja was genau du zur Datenbank schickst.

Desweiterem könnte dir das auch weiterhelfen
PHP:
mysql_query($sql) or die(mysql_error());
 
Hier die Ausgabe des Query:

PHP:
SELECT ID, Holzart, Klasse, Trockenheit, Partie, Kubik, Starke, Pfad FROM suchmaschine WHERE Holzart LIKE '%esche%' OR Klasse LIKE '%esche%' OR Trockenheit LIKE '%esche%' OR Partie LIKE '%esche%' OR Kubik LIKE '%esche%' OR Starke LIKE '%esche%'SELECT ID, Holzart, Klasse, Trockenheit, Partie, Kubik, Starke, Pfad FROM suchmaschine WHERE Holzart LIKE '%esche%' OR Klasse LIKE '%esche%' OR Trockenheit LIKE '%esche%' OR Partie LIKE '%esche%' OR Kubik LIKE '%esche%' OR Starke LIKE '%esche%'

Sobald ich jetzt ein Leerzeichen mache, kommt diese Ausgabe:

PHP:
SELECT ID, Holzart, Klasse, Trockenheit, Partie, Kubik, Starke, Pfad FROM suchmaschine WHERE Holzart LIKE '%esche %' OR Klasse LIKE '%esche %' OR Trockenheit LIKE '%esche %' OR Partie LIKE '%esche %' OR Kubik LIKE '%esche %' OR Starke LIKE '%esche %'

mysql_query hab ich natürlich drinnen.
 
Du müsstest erst mal die Suchbegriff aufsplitten an den Wortgrenzen zB mit explode() oder du machst für jedes Kriterium ein Feld.

Dann musst du den SQL Befehl anpassen.

Bei solchen Dingen wäre vielleicht eine Vorgabe der Suchbegriffe sinnvoll?
 
Die Suchbegriffe sind im Grunde immer ähnlich:

Meistens wird nur nach Partie gesucht, ich will aber auch noch die Suche abändern können indem ich z.b. nach der Holzart, nach der Stärke, nach der Klasse und nach der Trockenheit suchen kann.

Ich hab meine Abfrage jetzt mit Explode umgebaut, glaub aber das ichs falsch gemacht hab, weil es nicht funktioniert.

PHP:
if ($_POST["suchbegriff"])
    {
	$test = explode(" ", $_POST["suchbegriff"]);
	
    $sql = "SELECT
				ID,
                Holzart,
				Klasse,
				Trockenheit,
				Partie,
				Kubik,
				Starke,
				Pfad
            FROM
                suchmaschine
            WHERE
                Holzart LIKE '%" . mysql_real_escape_string(utf8_decode($test)) . "%' OR
				Klasse LIKE '%" . mysql_real_escape_string(utf8_decode($test)) . "%' OR
				Trockenheit LIKE '%" . mysql_real_escape_string(utf8_decode($test)) . "%' OR
				Partie LIKE '%" . mysql_real_escape_string(utf8_decode($test)) . "%' OR
				Kubik LIKE '%" . mysql_real_escape_string(utf8_decode($test)) . "%' OR
				Starke LIKE '%" . mysql_real_escape_string(utf8_decode($test)) . "%'"; 
          
		echo ('<tr ><th class="position">Holzart</th><th class="starke">St&auml;rke</th><th class="klasse">Klasse</th><th class="trocken">Trockenheit</th><th class="partie">Partienummer</th><th class="link">Link</th></tr> ');
		$result = mysql_query($sql) OR die(mysql_error());
		if(mysql_num_rows($result)) { // gucken ob was im Query drinsteckt
			while($row = mysql_fetch_object($result)) 
			{
				
				echo ('<tr>');
				echo ('<td class="position">'.(utf8_decode($row->Holzart)).'</td>');           
				echo ('<td class="starke">'.(utf8_decode($row->Starke)).'</td>');
				echo ('<td class="klasse">'.(utf8_decode($row->Klasse)).'</td>');
				echo ('<td class="trocken">'.(utf8_decode($row->Trockenheit)).'</td>');
				echo ('<td class="partie">'.(utf8_decode($row->Partie)).'</td>');
				echo ('<td class="link"><a href="'.(utf8_decode($row->Pfad)).'">'.(utf8_decode($row->Partie)).'</a></td>');
				echo ('</tr>');
			}
		}else{
				echo 'Suche ergab keine Treffer<br />';
		}
		echo $sql;

$test ist immer leer.
 
Hallöle,

also ich wär mir jetz nicht so sicher, ob man einfach $test ohne einen Index angeben kann, da explode deinen String ja in ein Array "einsortiert".

Weiterhin habe ich mal noch ein wenig gesucht und Interessantes gefunden:
Tutorial hier auf der Seite

Punkt 5.4 könnte auch etwas für dich sein, da das Ergebnis dabei noch nach Relevanz sortiert wird und alle Spalten mit einbezogen werden können.
Nach meinen Recherchen soll sich das aber erst ab großen Dokumenten wirklich bezahlt machen....leider kann ich da nicht aus Erfahrung sprechen, da ich das selber noch nicht benutzt habe.

Kannst es ja einfach mal ausprobieren - bei Problemen einfach nochmal melden.
 
Hm ich hab die Volltextsuche ausprobiert, funktioniert auch nicht so wirklich. Könnte es vielleicht an der Ajax funktionalität liegen?

Es werden in der DB ca. 60000 Einträge gespeichert mit tendenz nach oben, also denke ich mal, das das wirklich gross ist oder?
 
Es könnte daran liegen, das du keinen Index auf den entsprechenden Spalten legen kannst, weil die falsche DB-Engine verwendet wird. MyISAM kann, soweit ich mich erinnern kann, auf die Spalten FULLTEXT-Indizes legen, InnoDB kann das IMHO nicht.
 
mit ALTER TABLE name ENGINE = MYISAM kann ich die DB-Engine umstellen. Funktioniert trotzdem nicht wirklich. Zumindest nicht mit AJAX.

Wie haben das andere gelöst? Ich hab für Joomla einige plugins gefunden, welche AJAX und volltext suche verwenden, Google hat ja auch was ähnliches, Facebook auch.
 
Mit Ändern der Engine ist es nicht getan, natürlich müssen noch FULLTEXT-Indizes auf die jeweiligen Spalten gelegt werden.

Anders gefragt: Funktioniert die Abfrage in dem PHP-Script überhaupt ohne Ajax?
 
Zurück