zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden [MySQL] Suche

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 12.07.2005, 14:25
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 28.11.2004
Beiträge: 547
lomtas befindet sich auf einem aufstrebenden Ast
Standard [MySQL] Suche

Hallo,

ich möchte eine Suche realisieren. Habe die letzte Stunde mal bisschen rumprobiert und mir so meine Gedanken gemacht. Dabei sind mir Fragen gekommen. Die möchte ich hier stellen.

Mein Szenario: Ich habe eine Tabelle in der u.a. die drei Spalten vorname,name,gruppenname vorkommen. Diese möchte ich durchsuchen. Mein Suchstring soll mal mehr Worte haben und mal nur eins. Alle durch Leerzeichen getrennten Worte sollen sich so wie eine AND verbindung verhalten.

Erst habe ich das mit Like versucht. Dann habe ich mich mit Volltext Suche beschäftigt (habe ich davor noch nie gemacht) und bin dann auf das 3 zeichen problem gestoßen. Bei meiner Suche gibt es durchaus sinnvolle abfragen mit nur 3 zeichen. Leider werden diese bei einer volltextsuche einfach ignoriert. Ansonsten war ich mit volltext eingentlich sehr zufrieden.

Wie gestaltet man nun also eine Suche, die sich auch für drei Zeichen eignet und die alle drei spalten nach teilweise mehreren wörtern durchsucht?

Über Hilfe würde ich mich freuen. Vielleicht noch als Beispiel: Meine letzte Abfrage lautete

Code:
select gruppenname, name, vorname from cms_ma_ip_person where akteurart_id!=0 and match(gruppenname,name,vorname) against('set') and match(gruppenname,name,vorname) against('free') order by gruppenname
In das Suchfeld wurde dabei set free eingegeben. Diese Suche müsste genau ein Ergebnis liefern bei meiner Datenbank. wegen dem Set im String wird sie allerdings einfach ignoriert...

Hat jemand Lösungshilfen?
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 12.07.2005, 15:30
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.953
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

Evtl. wäre FIND_IN_SET für dich interessant:

Code:
SELECT gruppenname, name, vorname FROM cms_ma_ip_person WHERE akteurart_id!=0 AND
(FIND_IN_SET(gruppenname, 'set,free') OR
 FIND_IN_SET(vorname, 'set,free') OR
 FIND_IN_SET(name, 'set,free'))
ORDER BY gruppenname
Eine Volltextsuche halte ich für übertrieben. Falls du es doch willst, kannst du die minimale Wortlänge mit ft_min_word_len setzen (default ist 4). Danach musst du den Volltext-Index aber noch mal neu erstellen.

Siehe: http://dev.mysql.com/doc/mysql/en/fu...ne-tuning.html

Mario
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 12.07.2005, 16:32
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 28.11.2004
Beiträge: 547
lomtas befindet sich auf einem aufstrebenden Ast
Standard

also so wie ich das verstanden habe, ist es bei deiner abfrage so, dass er das entweder nur findet, wenn beide worte in einer zelle enthalten sind, oder auch wenn nur ein word in allen zellen enthalten ist.

folgende datensätze:
1 | david thomas | nobody | someone
2 | david | nobody | somenone
3 | thomas | someone | david

die abfrage obene würde entweder alle drei auswerfen, oder aber nur den ersten. ich möchte aber eine abfrage, die mir 1 und 3 auswirft...
Mit Zitat antworten
  #4 (permalink)  
Alt 12.07.2005, 16:35
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.953
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

Die Suche nach 'set' und 'free' findet da eigentlich überhaupt keinen Datensatz.

Mario
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
  #5 (permalink)  
Alt 12.07.2005, 16:42
Neuer Benutzer
neuer user
 
Registriert seit: 24.05.2005
Beiträge: 21
Carsten H. befindet sich auf einem aufstrebenden Ast
Standard

Eine andere, aber etwas aufwendigere Variante wäre es, die Suche über ein "Wörterbuch" zu realisieren.

Dafür brauchst Du drei Tabellen:
- Eine mit Deinen normalen Daten ("data")
- Eine mit den Wörtern ("words")
- Eine Relationstabelle für die Verbindung Wort<->Datensatz ("wd_rel")

Beispiel: Ein Datensatz mit der ID 1 und dem Text "Dies ist ein Test".

1.)
Splitten des Datensatzes an den Leerzeichen und die Einzelwörter in die Tabelle "words" schreiben. Durch einen auto_increment ID bekommen die alle eine eindeutige ID:

1 - Dies
2 - ist
3 - ein
4 - Test


2.)
Einfügen der Relation zwischen Wort und Datensatz-ID in die Tabelle "wd_rel". Das müsste dann ungefähr so aussehen (erster Wert = Wort-ID, zweiter Wert = Datensatz-ID

1 - 1
2 - 1
3 - 1
4 - 1


3.)
In einem Suchformular gibt nun jemand "dies ist" ein. Dann machst Du einen Query, der Dir die Datensatz-IDs ausspuckt, die über "wd_rel" mit den Wörter "Dies" und "ist" verknüpft ist. Das wars, dann musst Du nur die entsprechenden Datensätze laden.


Bei weiteren Datensätzen muss Du nun einfach nur überprüfen, ob es das Wort in "words" schon gibt. Wenn ja, dann nimm die alte ID und schreibe nur die neue Verknüpfung, wenn nein, speicher das neue Wort und schreibe die Verknüpfung mit der neuen ID des neuen Wortes.

Vorteil: Die Suche geht schneller, weil Du kein "LIKE" machen musst, sondern immer mit "=" vergleichen kannst. Außerdem hast Du keine Beschränkungen bezüglich der Wortlänge, es sei denn Du filterst im Voraus alles aus, was eine bestimmte Länge unterschreitet.

Nachteil: Zusätzliche Datenbanktabellen, die bei entsprechendem Content auch recht schnell anwachsen.

Bei einer Homepage mit nur 10-20 Unterseiten wäre dies Overkill, aber bei komplexeren Geschichten ist dies wohl die bessere Methode.
__________________
Musik-Sammler.de - Die Musiksammlungs-Verwaltung im Internet
--
Sense of View - Reviews ungewöhnlicher Filme aller Genres
Mit Zitat antworten
  #6 (permalink)  
Alt 12.07.2005, 17:23
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 28.11.2004
Beiträge: 547
lomtas befindet sich auf einem aufstrebenden Ast
Standard

so komplex wird es nicht, d.h. mir würde eine Lösung mit like reichen, aber die habe ich ja noch nicht...

ach ja und logischerweise habe ich bei meinem beispiel nicht nach set free gesucht sondern nach david thomas
Mit Zitat antworten
  #7 (permalink)  
Alt 12.07.2005, 18:20
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.953
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

Wo liegt denn genau das Problem mit einer LIKE-Lösung? Das nötige SQL kannst du dir doch einfach per Script zurechtbasteln. Das ist dann bei mehreren Suchwörtern und einer großen Datenbank zwar nicht mehr sehr schnell aber funktionieren sollte es für den Anfang erst mal.

Mario
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
  #8 (permalink)  
Alt 12.07.2005, 23:43
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 28.11.2004
Beiträge: 547
lomtas befindet sich auf einem aufstrebenden Ast
Standard

ich weiß nicht genau, wie ich die ganzen dinger verschachteln muss und wo and oder or hin muss, damit ich eine funktionierende lösung bekomme. hast du einen vorschlag?
Mit Zitat antworten
  #9 (permalink)  
Alt 13.07.2005, 00:44
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.953
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

Ohne es getestet zu haben, würde ich spontan etwas in der Art vorschlagen:

Code:
SELECT gruppenname, name, vorname FROM cms_ma_ip_person WHERE akteurart_id!=0
AND (gruppenname LIKE '%set%' OR vorname LIKE '%set%' OR name LIKE '%set%')
AND (gruppenname LIKE '%free%' OR vorname LIKE '%free%' OR name LIKE '%free%')
AND ...
ORDER BY gruppenname
Mario
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 13.07.2005, 09:44
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 28.11.2004
Beiträge: 547
lomtas befindet sich auf einem aufstrebenden Ast
Standard

Hey vielen Dank!

Das war die Lösung und eigentlich war sie ja recht einfach - ich bin halt nur nicht drauf gekommen. Habe mir das jetzt im script zusammengebastelt und das funktionier.
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Probleme mit der internen Suche auf einer Homepage hamel88 (X)HTML 9 03.08.2011 12:51
Suche Partner für kommerzielle Projekte felix_ Offtopic 5 19.12.2010 17:21
[Auftrag] Suche jemanden der mir ein vBB Design umsetzt owii CSS 0 18.07.2010 04:16
Suche Leute für ein Projekt! -Bambino- Offtopic 1 23.12.2007 09:17
[mySQL]: Suche Hilfe für komplexere Abfrage trequ Serveradministration und serverseitige Scripte 1 07.06.2007 13:17


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:30 Uhr.