Hartmut: MySQL REGEXP Formulierung für UND/AND-Verknüpfung

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

  1. 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

    1. 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

      1. 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