• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Volltextsuche und Komplexe Suche

Status
Für weitere Antworten geschlossen.

philipp

Neues Mitglied
Hallo

Ich will für mein derzeitiges projekt eine suchfunktion einbauen und dabei alles in allem 5 tabellen und insgesammt 13 felder meine MySQL datenbank durchsuchen lassen.

Dabei einerseits eine normale schnellsuche (ein textfeld auf startseite) die alles durchsucht und eine erweiterte suche, die ich derweil mal bleiben lasse.... zumindets bis ich die einfache habe.

ich wollt jetz fragen wie das am besten geht mit sql. für jedes feld eine mysqlabfrage zu schreiben erscheint mir etwas umständlich...
 
Hey,

du kannst doch die SQL Abfrage so gestalten

Code:
SELECT * FROM tbl_hassenichtgesehen WHERE id LIKE "%suchwort%" OR name LIKE "%suchwort%" ....

und dann kannste ja noch mehrere tabellen abfragen

z.B.

Code:
 SELECT * FROM tbl_hassenichtgesehen h1, tbl_hassenichtgesehen2 h2 WHERE h1.id LIKE "%suchwort%" OR h2.id LIKE "%suchwort%" OR h1.name LIKE "%suchwort%" OR h2.name LIKE "%suchwort%" ....

meintest du das so ?
 
ich meinte das eher so (nicht lachen :D - das is verwirrend und nicht annähernd fertig, und noch nie getestet-..)

PHP:
<?php
//Script zum durchsuchen relevanter Datenbanktabellen - Verbinden mit MySQL
include "******";
//Wieviele ergebnisse pro Seite?
//Festlegen relevanter datenbanktabellen
$bases =  array('**********', '*************', '***************', '******************', '******************');
$names = array('Ausgaben', 'Coverstorys', 'Themen', 'Redaktion', 'Votings');
$links = array('ausgabe', 'coverstory', 'thema', 'team', 'voting');
$idlinks = array('show', 'coverstory', 'showthema', 'showteamdetail', 'show');
//index festlegen damit der tabelle ein name zugeordnet werden kann
$index = 1;
$felder_ktn['Ausgaben'] = array('ausgabennr', 'ausgabenbeschreibung');
$felder_ktn['Coverstorys'] = array('titel', 'inhalt', 'anleser');
$felder_ktn['Themen'] = array('titel', 'inhalt', 'anleser');
$felder_ktn['Redaktion'] = array('name', 'vorname', 'email', 'statement');
$felder_ktn['Votings'] = array('frage');
echo "<p>Suchergebnisse f&uuml;r: ".(htmlentities($_POST['ktn_vts']))."</p>";
echo "<table width=\"85%\" cellpadding=\"3\" cellspacing=\"3\" align=\"center\">";
foreach ($base as $value) {
	$bezeichner = $names[$index];
	foreach ($felder_ktn[$names[$index]]) as $feld) {
		$res = mysql_fetch_array("SELECT *, LEFT(treffer, 100) FROM `$value` WHERE (MATCH($feld) AGAINST ('".$_POST['ktn_vts']."'))");
		echo "<tr><th colspan=\"2\"><p>Treffer in: $bezeichner &raquo; $feld</p></th></tr>";
		while ( $row = mysql_fetch_array($res)) {
			$treffer = re_red($row['treffer'], $_POST['ktn_vts']);
			$treffer_formed = re_aouss($treffer);
			echo "<tr>";
			echo "<td><p>".$treffer_formed."</p></td>";
			echo "<td><p style=\"text-align:right;\"><a href=\"".$_SERVER['PHP_SELF']."go=".$links[$index]."&".$idlinks[$index]."=".$row['ID']."\">Hier gehts weiter</a></p></td>";
			echo "</tr>";
		}
	}
	$index++;
}
echo "</table>";
?>

da fehlt natürlich noch paging, filter und alles mögliche... mir gings mal nur um eine suche.
 
also ... das problem ist mir jetzt imo zu komplex bin nämlich aufa arbeit ... werd mal sehen, falls bis dato noch keiner helfen konnte, ob ich zuhause dazu komme
 
das wär super ... ich sag jetz schonmal danke. vielleicht krig ichs auch so zum laufen :D:D

Update:
Version2:
PHP:
<h1>Ihr Suchergebnisse</h1>
<?php
//Script zum durchsuchen relevanter Datenbanktabellen - Verbinden mit MySQL
include "********";
//Wieviele ergebnisse pro Seite?
//Festlegen relevanter datenbanktabellen
$bases =  array('***********', '******************', '***********', '**************', '***************');
$names = array('Ausgaben', 'Coverstorys', 'Themen', 'Redaktion', 'Votings');
$links = array('ausgabe', 'coverstory', 'thema', 'team', 'voting');
$idlinks = array('show', 'coverstory', 'showthema', 'showteamdetail', 'show');
//index festlegen damit der tabelle ein name zugeordnet werden kann
$index = 0;
$felder_ktn['Ausgaben'] = array('ausgabennr', 'ausgabenbeschreibung');
$felder_ktn['Coverstorys'] = array('titel', 'inhalt', 'anleser');
$felder_ktn['Themen'] = array('titel', 'inhalt', 'anleser');
$felder_ktn['Redaktion'] = array('name', 'vorname', 'email', 'statement');
$felder_ktn['Votings'] = array('frage');
echo "<p>Suchergebnisse f&uuml;r: ".(htmlentities($_POST['ktn_vts']))."</p>";
echo "<table width=\"85%\" cellpadding=\"3\" cellspacing=\"3\" align=\"center\">";
foreach ($bases as $value) {
	$bezeichner = $names[$index];
	foreach ($felder_ktn[$names[$index]] as $feld) {
		$res = mysql_query("SELECT *, LEFT($feld, 100) AS treffer FROM `$value` WHERE (MATCH($feld) AGAINST ('".$_POST['ktn_vts']."'))");
		echo "<tr><th colspan=\"2\"><p>Treffer in: $bezeichner &raquo; $feld</p></th></tr>";
		while ( $row = mysql_fetch_array($res)) {
			$treffer = re_red($row['treffer'], $_POST['ktn_vts']);
			$treffer_formed = re_aouss($treffer);
			echo "<tr>";
			echo "<td><p>".$treffer_formed."</p></td>";
			echo "<td><p style=\"text-align:right;\"><a href=\"".$_SERVER['PHP_SELF']."go=".$links[$index]."&".$idlinks[$index]."=".$row['ID']."\">Hier gehts weiter</a></p></td>";
			echo "</tr>";
		}
	}
	$index++;
}
echo "</table>";
?>
 
Zuletzt bearbeitet:
im moment is der fehler hier:
PHP:
<php
$res = mysql_query("SELECT *, LEFT($feld, 100) AS treffer FROM `$value` WHERE (MATCH($feld) AGAINST ('".$_POST['ktn_vts']."'))");
 
habs mal als text ausgeben lassen und durch phpmyadmin geschickt
Code:
Fehler

SQL-Befehl: Dokumentation

SELECT * , LEFT( ausgabennr, 100 ) AS treffer
FROM `**************`
WHERE (

MATCH (
ausgabennr
)
AGAINST (
'3'
)
)
LIMIT 0 , 30

MySQL meldet: Dokumentation
#1191 - Can't find FULLTEXT index matching the column list

hab das problem mittels google gelöst und verwende nun LIKE statt volltext

Mod-Edit: Zusammenführung - Doppelpost (XraYSoLo)
 
@xray:danke

so noch eine frage: wie kann ich meine aktuelle abfrage so abändern, dass ich nicht nur die 100% übereinstimmenden ergebnisse bekomme?

aktuell:
PHP:
<h1>Ihr Suchergebnisse</h1>
<?php
//Filtering
if ( isset($_POST['ktn_vts']) && $_POST['ktn_vts'] !== '' ) {
##########################################################################
//Script zum durchsuchen relevanter Datenbanktabellen - Verbinden mit MySQL
include "++++++++++++";
require_once "**************";
//Wieviele ergebnisse pro Seite?
//Festlegen relevanter datenbanktabellen
$bases =  array('+', '*', '-', '/', '^');
$names = array('Ausgaben', 'Coverstorys', 'Themen', 'Redaktion', 'Votings');
$links = array('ausgabe', 'coverstory', 'thema', 'team', 'voting');
$idlinks = array('show', 'coverstory', 'showthema', 'showteamdetail', 'show');
//index festlegen damit der tabelle ein name zugeordnet werden kann
$index = 0;
$proof = 0;
$felder_ktn['Ausgaben'] = array('ausgabennr', 'ausgabenbeschreibung');
$felder_ktn['Coverstorys'] = array('titel', 'inhalt', 'anleser');
$felder_ktn['Themen'] = array('titel', 'inhalt', 'anleser');
$felder_ktn['Redaktion'] = array('name', 'vorname', 'email', 'statement');
$felder_ktn['Votings'] = array('frage');
echo "<h3>Suchergebnisse f&uuml;r: ".(htmlentities($_POST['ktn_vts']))."</h3>";
echo "<table width=\"85%\" cellpadding=\"3\" cellspacing=\"3\" align=\"center\">";
foreach ($bases as $value) {
	$bezeichner = $names[$index];
	foreach ($felder_ktn[$names[$index]] as $feld) {
		$anzahl = mysql_fetch_array(mysql_query("SELECT COUNT(`ID`) as anzahl FROM `$value` WHERE $feld LIKE ('%".$_POST['ktn_vts']."%')"));
		if ( $anzahl['anzahl'] > 0 ) {
			$res = mysql_query("SELECT * FROM `$value` WHERE $feld LIKE ('%".$_POST['ktn_vts']."%')");
			echo "<tr><th colspan=\"2\"><p>Treffer in: $bezeichner &raquo; $feld</p></th></tr>";
			while ( $row = mysql_fetch_array($res)) {
				$treffer = eregi_replace($_POST['ktn_vts'], "<span style=\"color:red\">".$_POST['ktn_vts']."</span>", $row[$feld]);
				$treffer_formed = re_aouss($treffer);
				echo "<tr>";
				echo "<td><p>".$treffer_formed."<br style=\"clear:left;\"/><hr/></p></td>";
				echo "<td width=\"150px\" valign=\"top\"><p style=\"text-align:right;\"><a href=\"".$_SERVER['PHP_SELF']."?go=".$links[$index]."&".$idlinks[$index]."=".$row['ID']."\">Hier gehts weiter</a></p></td>";
				echo "</tr>";
			$proof = 1;
			}
		} 
	}
	$index++;
}
echo "</table>";
if ( $proof == 0 ) {
	echo	"<p>Es konnten keine Treffer in der Datenbank gelandet werden.</p>";
}
#################################################################################
} else {
	echo	"<p>Geben sie einen g&uuml;ltigen Suchbegriff ein!</p>";
}
?>

meine vermutung wäre ja ein ersetzen des suchstrings. also zb ein leerzeichen mit % ersetzen, dass doch für beliebige zeichenfolgen steht, oder?

wie wäre es am effektivsten?
 
okay, das hab ich gelöst, und zwar so, dass " " durch "%" ersetzt wird. hab aber ein anderes problem:

ich lande nur in den datensätzen treffer in deinen bei "zum beispiel" das "zum" vor dem "beispiel" steht, da der suchstring ja "zum%beispiel" ist. ich will aber auch alle "beispiel***zum" bekommen. geht das überhaupt über LIKE?

oder müsste ich dafür einen "volltextindex" haben und die suche als volltextsuche realisieren?
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben