|
|||
[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 Hat jemand Lösungshilfen? |
Sponsored Links |
|
||||
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 Siehe: http://dev.mysql.com/doc/mysql/en/fu...ne-tuning.html Mario |
Sponsored Links |
|
|||
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... |
|
|||
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 |
|
|||
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 |
|
|||
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?
|
|
||||
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 |
Sponsored Links |
|
|||
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. |
Sponsored Links |
Themen-Optionen | |
Ansicht | |
|
|
Ä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 |