MySQL REGEXP Formulierung für UND/AND-Verknüpfung
Hartmut
- datenbank
Hallo,
für die OR-Verknüpfung bei der DB-Abfrage habe ich
REGEXP "(^| )the($| )|(^| )who($| )"
REGEXP "(^| )the($| )|(^| )roling($| )|(^| )stones($| )"
gewählt.
Bei LIKE habe ich die Problematik, dass '%who%' auch alle Datensätze findet, bei denen der Suchbegriff Teilwort des Datensatzes ist. Bei '% who %' wird der Begriff zwar als einzelnes Wort, aber nicht mehr am Anfang oder Ende des Datenfeldes gefunden. Deshaln nutze ich jetzt die reguläre Abfrageform.
Für ODER-Verknüpfungen brauche ich so auch nur die Teilworte wie oben gezeigt zu verbinden um das MySQL-Statement zu erzeugen.
Leider findet der Ausdruck so aber zu viele Einträge in der DB. Die ODER-Form soll also nur genutzt werden wenn UND nichts findet.
Die Suchfelder sind zwar alle Volltext-Indiziert aber die binäre Suche findet bei mir irgendwie keine Datensätze, ich weiß nicht was ich da falsch mache. Außerdem muss man den Nutzer erst + - "" erklären.
Für die AND-Suche benötige ich also einen Reguläre Ausdrucksform, die UND-Verknüpft mehre Worte '(^| )wort($| )' in beliebiger Reihenfolge innerhalb eines Datensatzes findet.
Eine Abfrage der Form a&b|b&a für zwei Begriffe ist noch einfach. Drei Worte sind mit a&b&c|a&c&b|b&a&c|b&c&a|c&a&b|c&b&a auch noch zu schaffen. aber wenn jemand mehr Worte in die Suche eingibt entsteht so ein unüberschaubarer Konstrukt. Ich bin mir sicher das es bei Regulären Ausdrücken auch eine elegantere Möglichkeit gibt, eine beliebige Anzahl Wörter in beliebiger Reihenfolge zu finden.
Weiß jemand von Euch hier eine unkomplizierte Variante?
Sonst muss ich für die UND-Verknüpfung wohl doch auf LIKE '%wort%' setzen. Oder kennt vielleicht jemand für das o.g. LIKE-Problem für ganze Wörter, auch am Beginn oder Ende des Datenfeldes eine Alternative?
Ich bedanke mich schon mal für hoffentlich hilfreiche Infos
Hartmut
__
Falls jemand diese Info benötigt:
Ich nutze als Datenbank die zzt. bei 1&1 installiert Version MySQL5.0
Hallo
für die OR-Verknüpfung bei der DB-Abfrage habe ich
REGEXP "(^| )the($| )|(^| )who($| )"
REGEXP "(^| )the($| )|(^| )roling($| )|(^| )stones($| )"gewählt.
könntest Du bitte Dein Problem genauer beschreiben.
Gib ein paar Beispieldatensätze an und welches Ergebnis Du von Deinem Statement erwartest.
Die Suchfelder sind zwar alle Volltext-Indiziert aber die binäre Suche findet bei mir irgendwie keine Datensätze, ich weiß nicht was ich da falsch mache.
Mangels Glaskugel weiß das außer Dir auch keiner.
Was hast Du getan, welche Daten waren vorhanden, welches Statement hast Du verwendet, welches Ergebnis hast Du erwartet, welches hast Du bekommen?
Wenn Du Hilfe erwartest, dann solltest Du auch geeignete Informationen zur Verfügung stellen. Hellsehen kann hier keiner.
Freundliche Grüße
Vinzenz
Hallo
also, es handelt sich um eine Shopsystem-DB (oscommerce) mit zusätzlichen Tabellen für eine Tonträger-Datenbank.
Aktuell ist das von einem anderen gemacht live unter http://xxlmusicworld.de zu bestaunen (soll heißen, wenn der Server mal nicht offline ist). Dort erfolgt die Suche beispielsweise per
SELECT * FROM Interpreten WHERE Name LIKE '%mehrere Begriffe%'
In der Interpreten-Tabellen stehen die Interpretennamen bei Einzelinterpreten in der Form
NACHNAME, Vorname
z.B.
MOSER, Hans
BLACK, Roy
und das gibt normal ja keiner in die Suchmaske ein.
Bei Gruppen wie 'The Who' hat der Erfasser der Daten unglücklicherweise das The weggelassen. Hier steht nur 'WHO' im Datenfeld.
z.B.
ROLLING STONES
EINSTÜRZENDE NEUBAUTEN
Das zzt. verwendete LIKE-Statement
SELECT Name, Interpret FROM xxlinterpret WHERE Name LIKE '%toni%'
findet:
ANTONIA
ANTONIA feat. SANDRA
ARNOLD, Toni
BAIRISCH DIATONISCHER JODELWAHNSINN
BANDERAS, Antonio / DE ALMEIDA, Joaquim
BANDERAS, Antonio / JOLIE, Angelina / JANE, Thomas
BANDERAS, Antonio / ROMIJN-STAMOS, Rebecca
BENDA, Jiri Antonin / PRAGUE CHAMBER ORCHESTRA / BENDA, Christian
BIRET, Idil / POLISH NATIONAL RADIO SYMPHONY ORCHESTRA / WIT, Antoni
BRAXTON, Toni
BRAXTON, Toni & KENNY G
CHACON, Don Antonio / MONTOYA, Ramon
CHILDS, Toni
COLLETTE, Toni/GRIFFITHS, Rachel/HUNTER, Bill
COTTURA, Toni
CRUISE, Tom/PITT, Brad/BANDERAS, Antonio/SLATER, Christian
CRYPTONITE
DJ ARNIE feat. 4 STONIS
DR. TONIC TEAM
GARCIA, Toni feat. LIL SUZY
GILBERT, Melissa/PENNY, Joe/FRANCIOSA, Toni
GLAHE, Will & KARNEVALSORCHESTER / THELEN, Kurt-Adolf / GERHARDS, Toni
GRANT, Hugh / COLLETTE, Toni / WEISZ, Rachel
GRAPPATONI
HALLIDAY, Toni
HARRIS, Ed / MASTRANTONIO, Mary Elizabeth / BIEHN, Michael
HORTA, Toninho
KLIEGEL, Maria / POLISH NATIONAL RADIO SYMPHONY ORCHESTRA - WIT, Antoni
LINDT, Toni
LOS LOBOS & BANDERAS, Antonio
MAIER, Toni & BAND
MALDEN, Karl/VAN DOHLEN, Lenny/KALEM, Toni/VAN PATTEN, Joyce
MOLINA, Antonio
MONTGOMERY, Lee/HUDSON, Toni
PUTRINO, Toni
SALMONELLI, Toni
SINATRA, Frank & JOBIM, Antonio Carlos
SPEARMAN, Toni
THAYER, Max/DRESDEN, John/NERO, Toni/MONTE, Mike
TONIC
TONICS
TONINO
TONIO K.
TONY TONI TONE
WILLIS, Bruce/OSMENT, Haley Joel/COLETTE, Toni
YOUNG TEUTONIC STREET BAND
Ein Auszug für die Suche nach 'Toni' mit
SELECT Name, Interpret FROM xxlinterpret WHERE Name REGEXP "(^| )toni($| )"
ergibt z.B.:
ARNOLD, Toni
BRAXTON, Toni
BRAXTON, Toni & KENNY G
CHILDS, Toni
COTTURA, Toni
GARCIA, Toni feat. LIL SUZY
GILBERT, Melissa/PENNY, Joe/FRANCIOSA, Toni
GLAHE, Will & KARNEVALSORCHESTER / THELEN, Kurt-Adolf / GERHARDS, Toni
GRANT, Hugh / COLLETTE, Toni / WEISZ, Rachel
HALLIDAY, Toni
LINDT, Toni
MAIER, Toni & BAND
MONTGOMERY, Lee/HUDSON, Toni
PUTRINO, Toni
SALMONELLI, Toni
SPEARMAN, Toni
TONY TONI TONE
WILLIS, Bruce/OSMENT, Haley Joel/COLETTE, Toni
während
SELECT Name, Interpret FROM xxlinterpret WHERE Name LIKE 'toni'
gar nichts findet, findet
SELECT Name, Interpret FROM xxlinterpret WHERE Name LIKE '% toni %'
nur noch:
BRAXTON, Toni & KENNY G
GARCIA, Toni feat. LIL SUZY
GRANT, Hugh / COLLETTE, Toni / WEISZ, Rachel
MAIER, Toni & BAND
TONY TONI TONE
weil bei allen anderen 'toni' am Anfang oder Ende des Feldes steht.
Daran kann man vielleicht schon ein bischen erahnen wie die Daten in der Tabelle aussehen und wo die Schwierigkeiten liegen.
Ich bin zzt. an der technischen Überarbeitung unter:
http://xxlmusicworld.onsign.de
Für Besucher die 'the who' suchen findet die Maschine nichts, weil nur 'WHO' drin steht. Die ODER-Suche nach REGEXP "(^| )the($| )|(^| )who($| )" findet natürlich Unmengen weil zzt. nach das Stopwort 'the' mitgesucht wird. Ebenfalls ist mir bekannt, dass andere Sonderzeichen in der Eingabe ebenfalls gegen Leerzeichen ausgetauscht und mehrere zusammengefaßt werden müssen.
Aber wie gesagt für die ODER-Suche habe ich mich schon festgelegt auf die dargestellte REGEXP-Suche.
Meine Frage war, wie ich eine AND-Suche mit
regulären Ausdrücken erreichen kann
Die Eingabe von 'hans moser' soll
Hans, MOSER
MOSER, Hans
MOSER, Hans & HÖRBIGER, Paul
finden. Nicht aber:
ALBERS, Hans
DURAND, Angela & CARSTE ORCHESTER, Hans
RÜHMANN, Heinz / BRAUSEWETTER, Hans / SIEBER, Josef
MOSER, Peter
MOSER, Hansl
MOSERMANN, Hans
Die Eingabe von 'master grand five' soll
GRAND MASTER FLASH FIVE
FIVE GRAND MASTER
finden. Nicht aber:
GRAND MASTER FLASH
GRAND FUNK RAILROAD
HOUSE MASTER BOYZ & RUDE BOY OF HOUSE
GRAND MASTERS FIVE
GRANDMASTER FLASH & FURIOUS FIVE
GRANDMASTER FLASH & FURIOUS FIVE feat. MEL, Melle
und wer 'five master grand flash' eingibt soll nur noch
GRAND MASTER FLASH FIVE
finden.
Ich suche also weiterhin nach einem Regulären Ausdruck, der mir im untersten Beispiel die REGEXP-Suche nach den Ausdrücken '(^| )five($| )', '(^| )master($| )', '(^| )grand($| )' und '(^| )flash($| )' in beliebiger Reihenfolge ermöglicht.
Also Quasi ein Muster nach dem ich beliebig viele Wörter in beliebiger Reihenfolge beschreiben kann, die aber alle enthalten sein müssen (AND-Funktion).
So ich hoffe, das war jetzt Beispiel genug für meine Anfrage.
Mit bestem Dank
Hartmut
Hallo
Ich suche also weiterhin nach einem Regulären Ausdruck, der mir im untersten Beispiel die REGEXP-Suche nach den Ausdrücken '(^| )five($| )', '(^| )master($| )', '(^| )grand($| )' und '(^| )flash($| )' in beliebiger Reihenfolge ermöglicht.
Also Quasi ein Muster nach dem ich beliebig viele Wörter in beliebiger Reihenfolge beschreiben kann, die aber alle enthalten sein müssen (AND-Funktion).
Lösung gefunden:
WHERE tabellenspalte REGEXP "suchbegriff1" AND tabellenspalte REGEXP "suchbegriff2"
manchmal hat man Tomaten auf den Augen. Ich hatte auch
WHERE tabellenspalte (REGEXP "suchbegriff1" AND REGEXP "suchbegriff2")
und
WHERE tabellenspalte REGEXP ("suchbegriff1" AND "suchbegriff2")
probiert und das klappte nicht. Auf die Syntax der Lösung bin ich nicht gekommen.
Danke für Eure Hilfe
Hartmut