2008-09-01 11 views
1

Ich baue eine grundlegende Suchfunktionalität mit LIKE (ich würde Volltext verwenden, kann es aber zur Zeit nicht) und ich frage mich, ob MySQL auf der Suche nach ein Schlüsselwort (z. B. WHERE-Feld wie "% word%") gibt auch 20 Wörter auf beiden Seiten des Schlüsselwortes zurück?Auswahl von X Wörtern aus einem Textfeld in MySQL

Antwort

2

Sie alles in der Abfrage Sie können mit SUBSTRING_INDEX

CONCAT_WS(
' ', 
-- 20 words before 
TRIM(
    SUBSTRING_INDEX(
     SUBSTRING(field, 1, INSTR(field, 'word') - 1), 
     ' ', 
     -20 
    ) 
), 
-- your word 
'word', 
-- 20 words after 
TRIM(
    SUBSTRING_INDEX(
     SUBSTRING(field, INSTR(field, 'word') + LENGTH('word')), 
     ' ', 
     20 
    ) 
) 

)

+0

, wenn ich mehr als ein Wort haben Anpassung zu tun? was soll ich machen? – davidlee

0

Verwenden Sie die Funktion INSTR(), um die Position des Wortes in der Zeichenfolge zu finden, und verwenden Sie dann die Funktion SUBSTRING(), um einen Teil der Zeichen vor und nach der Position auszuwählen.

Sie müssten darauf achten, dass Ihre SUBSTRING-Anweisung keine negativen Werte verwendet oder Sie seltsame Ergebnisse erhalten.

Versuchen Sie das und berichten Sie zurück.

1

Ich glaube nicht, seine möglich die Anzahl der Wörter zu begrenzen zurückgegeben, aber die Anzahl der Zeichen zu begrenzen zurück Sie so etwas wie

SELECT SUBSTRING(field_name, LOCATE('keyword', field_name) - chars_before, total_chars) FROM table_name WHERE field_name LIKE "%keyword%" 
  • chars_before tun könnte - ist die Anzahl der Zeichen Sie auswählen möchten vor dem Suchbegriff (e)
  • total_chars - wird wählen die Gesamtzahl der Zeichen Sie wünschen

dh das folgende Beispiel 30 Zeichen der Daten zurückgeben von 15 Zeichen vor dem Schlüsselwort

SUBSTRING(field_name, LOCATE('keyword', field_name) - 15, 30) 

Hinweis starrend: wie Aryeh wies darauf hin, etwaige negative Werte in SUBSTRING() bummeln Dinge deutlich - zum Beispiel, wenn die Das Schlüsselwort wird innerhalb der ersten [chars_before] Zeichen des Feldes gefunden. Dann werden die letzten [chars_before] Zeichen der Daten im Feld zurückgegeben.

0

Ich denke, Ihre beste Wette ist, das Ergebnis per SQL-Abfrage zu erhalten und einen regulären Ausdruck programmatisch anzuwenden, der es Ihnen ermöglicht, eine Gruppe von Wörtern vor und nach dem gesuchten Wort abzurufen.

Ich kann es jetzt nicht testen, aber der reguläre Ausdruck etwas sein soll:

.*(\w+)\s*WORD\s*(\w+).* 

wo Sie WORD für das gesuchte Wort ersetzen und regex Gruppe 1 wie zuvor Worte verwenden, und 2 nach -words

ich werde es später testen, wenn ich meine RegexBuddy fragen, ob es sich :) funktioniert und ich werde es hier posten

Verwandte Themen