Volltextsuche und Komplexe Suche

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

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

und dann kannste ja noch mehrere tabellen abfragen

z.B.

 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 :smiley: - 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 "

Suchergebnisse für: ".(htmlentities($_POST['ktn_vts']))."

"; echo ""; 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 ""; while ( $row = mysql_fetch_array($res)) { $treffer = re_red($row['treffer'], $_POST['ktn_vts']); $treffer_formed = re_aouss($treffer); echo ""; echo ""; echo ""; echo ""; } } $index++; } echo "

Treffer in: $bezeichner » $feld

".$treffer_formed."

Hier gehts weiter

"; ?>

[/php]

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]

Ihr Suchergebnisse

<?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 "

Suchergebnisse für: ".(htmlentities($_POST['ktn_vts']))."

"; echo ""; 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 ""; while ( $row = mysql_fetch_array($res)) { $treffer = re_red($row['treffer'], $_POST['ktn_vts']); $treffer_formed = re_aouss($treffer); echo ""; echo ""; echo ""; echo ""; } } $index++; } echo "

Treffer in: $bezeichner » $feld

".$treffer_formed."

Hier gehts weiter

"; ?>[/php]

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‘].„'))“);
[/php]

zeig’ un mal die fehlermeldung bitte.

Nils aka XraYSoLo

habs mal als text ausgeben lassen und durch phpmyadmin geschickt

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]

Ihr Suchergebnisse

<?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 "

Suchergebnisse für: ".(htmlentities($_POST['ktn_vts']))."

"; echo ""; 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 ""; while ( $row = mysql_fetch_array($res)) { $treffer = eregi_replace($_POST['ktn_vts'], "".$_POST['ktn_vts']."", $row[$feld]); $treffer_formed = re_aouss($treffer); echo ""; echo ""; echo ""; echo ""; $proof = 1; } } } $index++; } echo "

Treffer in: $bezeichner » $feld

".$treffer_formed."


Hier gehts weiter

"; if ( $proof == 0 ) { echo "

Es konnten keine Treffer in der Datenbank gelandet werden.

"; } ################################################################################# } else { echo "

Geben sie einen gültigen Suchbegriff ein!

"; } ?> [/php]

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?

versuch mal

%zum beispiel% anstatt zum%beispiel

ey, ihr seid doch grabschänder…

Closed: Grabschändung (XraYSoLo)