2008-09-01 82 views
1

我正在構建一個基本的搜索功能,使用LIKE(我會使用全文,但目前不能),我想知道MySQL是否可以,搜索一個關鍵字(例如WHERE字段LIKE'%word%')會返回關鍵字兩邊的20個單詞嗎?從MySQL中的文本字段中選擇X字

回答

2

可以使用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

如果我有一個以上的字做配套?我該怎麼辦? – davidlee 2015-10-31 06:07:05

0

使用INSTR()函數在字符串中查找單詞的位置,然後使用SUBSTRING()函數在位置前後選擇一部分字符。

您必須注意,您的SUBSTRING指令不使用負值,否則會得到奇怪的結果。

試試這個,然後回報。

1

我不認爲它可以限制返回單詞的數量,但是要限制字符的數量退還你可以做類似

SELECT SUBSTRING(field_name, LOCATE('keyword', field_name) - chars_before, total_chars) FROM table_name WHERE field_name LIKE "%keyword%" 
  • chars_before - 是 字符數你希望 關鍵字
  • total_chars之前選擇 - 是要 字符的 總數選擇

即下面的例子將返回數據的關鍵字之前從15個字符盯着的30個字符

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

注:如aryeh指出的那樣,在SUBSTRING()任何負值相當壞蛋東西 - 例如,如果所述關鍵字在字段的第一個[chars_before]字符中找到,然後返回字段中最後一個[chars_before]字符的數據字符。

0

我認爲你最好的選擇是通過SQL查詢得到結果,並以編程方式應用一個正則表達式,這將允許你在搜索到的單詞之前和之後檢索一組單詞。

我現在不能測試,但正則表達式應該是這樣的:

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

,你更換WORD的搜索詞,並使用正則表達式1組爲前字,和2後-words

我以後會測試它時,我可以問我RegexBuddy是否會工作:)我將張貼在這裏