4 Stimmen

Rückwärtsübereinstimmung mehrerer Wörter

Danke, dass Sie das gelesen haben. Ich hoffe, Sie können mir helfen.

Wenn ich eine Mysql-Tabelle mit diesen Zeilenwerten habe

id| Suche
\========
1| Schmetterlinge
2| Amerika
3| Vögel Amerikas
4| amerika schmetterlinge

Wie kann ich feststellen, in welchen Zeilen alle Wörter in der Spalte "search" in der Zeichenfolge "butterflies of america" vorkommen, unabhängig von der Anzahl oder Reihenfolge der Suchwörter?

(In diesem Beispiel möchte ich 1, 2 und 4 abrufen) Ich verwende jetzt eine kodierte Schleife, um dieses Problem zu lösen, wäre schön, es effizienter mit mysql zu beheben. Ich habe die Volltextsuche und reguläre Ausdrücke ausprobiert, bin aber komplett aufgeschmissen. Tx.

1voto

Riedsio Punkte 9460

Verschachtelte Ersetzungen, keine Unterabfragen.

SELECT id, search
FROM  a 
WHERE LENGTH( TRIM( 
REPLACE( REPLACE( REPLACE( 
CONCAT(  ' ', search,  ' ' ) ,  
' butterflies ',  ' ' ) ,  ' of ',  ' ' ) ,  ' america ',  ' ' ) ) ) = 0

        id  search
        1   butterflies
        2   america
        4   america butterflies

Ich habe die Wörter, nach denen gesucht werden soll, mit Leerzeichen versehen, um sicherzustellen, dass Sie nicht mit der Mitte von Wörtern übereinstimmen (z. B. "of" in "Kaffee"). Außerdem habe ich Leerzeichen als Buchstützen in die search Satz, um das erste und das letzte Wort zu berücksichtigen.

0voto

Yasen Zhelev Punkte 3950
SELECT * 
FROM table_name 
WHERE search LIKE '%butterflies%' 
  AND search LIKE '%of%' 
  AND search LIKE '%america%';

o

SELECT * 
FROM table_name 
WHERE search REGEXP 'butterflies|of|america'; // not working

Wenn ich nicht etwas übersehe :)

Edit: Ich habe etwas übersehen :(

0voto

Madison Caldwell Punkte 842

Hier ist eine Methode, mit der ich experimentiert habe (obwohl sie nicht sehr effizient ist):

select search, replace(filtered, 'butterflies', '') as filtered from (
   select search, replace(filtered, 'of', '') as filtered from (
      select search, replace(search, 'america', '') as filtered from table_name a
   ) b
) c;

Diese Abfrage ergibt etwa folgendes Bild:

+---------------------+----------+
| search              | filtered |
+---------------------+----------+
| butterflies         |          |
| america             |          |
| birds of america    | birds    |
| america butterflies |          |
+---------------------+----------+

Der letzte Teil, damit dies funktioniert, bereitete mir jedoch einige Schwierigkeiten... Sie benötigen eine Where-Klausel, die alle Zeilen zurückgibt, die "leer" sind (d. h. nur Leerzeichen enthalten).

Dadurch wird die dritte Zeile herausgefiltert und die gewünschte Ergebnismenge zurückgegeben. Allerdings war ich nicht in der Lage, dies zu bekommen, mit trim() zu arbeiten und ich weiß nicht, warum.

Ich habe es zum Beispiel versucht:

where length(trim(c.filtered)) = 0;

Dies führte nicht zu der gewünschten Ergebnismenge. Ich habe jetzt keine Zeit mehr, mich damit zu beschäftigen, aber ich wollte diesen Ansatz für den Fall erwähnen, dass sich jemand anderes einmischen und das Rätsel zu Ende lösen möchte. Falls nicht, werde ich versuchen, heute oder morgen etwas mehr darüber zu erfahren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X