2011-06-06 16 views
0

我試圖創建帶有關鍵字高亮顯示的搜索表單,但顯然如果它沒有出現在列表結果的前幾個句子中,我將無法突出顯示該關鍵字 - 所以我需要創建一個sql語句,該語句將填充找到的關鍵字左側的字符數和右側的相同字符數。mysql選擇關鍵字周圍的內容

任何人都知道SQL語句會是什麼樣的東西?

確定 - 澄清 - 想象下面的SQL語句:

SELECT * 
FROM `articles` 
WHERE `content` LIKE '%keyword%' 

現在 - 這條語句將返回一個結果列表WHERE子句匹配它。

我在做什麼接下來我包裹withing結果與跨度設定所有關鍵字高亮顯示關鍵字使用下面的方法(PHP):

public static function highlight($string = null, $keyword = null, $class = 'highlight') { 
    return str_ireplace($keyword, "<span class=\"{$class}\">{$keyword}</span>", $string); 
} 

現在,這將正常工作,但每個結果只顯示每個結果的起始X個字符。

我想要實現的是首先識別內容中的關鍵字,然後從該關鍵字的左側和右側抓取一些內容,這樣關鍵字總是出現在每個結果中。

我希望這是有道理的。

+0

到目前爲止你有什麼? – 2011-06-06 23:01:25

回答

0

好了 - 我想我已經想通了 - 這裏是我想出來的:

SELECT 
IF (
    LOCATE('keyword', `content`) < 20, 
    SUBSTRING(`content`, 1, 200), 
    SUBSTRING(`content`, LOCATE('keyword', `content`) - 20, 200) 
) AS `content` 
FROM `table` 
WHERE `content` LIKE '%keyword%' 

首先確定關鍵詞的位置,那麼如果它的指數低於20我只要從開始時的內容,如果它存在的進一步隨後20指數,然後我抓住它的指數minux 20個字符,下至200所有人物 - 一起工作!

感謝尼克 - 你的回答非常有幫助。

剩下的一件事 - 我如何從內容字段中去除html標籤,以便它們被刪除 - 也許使用REGEXP - 任何人都知道如何?

2

這可以改善,但在我看來,您正在尋找這樣的事情

select *, 
case 
when locate('search_test',field) < 10 then substring(field,1,char_length('search_test')+10) 
else substring(field from locate('search_test',field) - 10 for char_length('search_test') + 20) 
end as content 
from table 
where field like '%search_test%' 
+0

謝謝你 - 我相信它非常接近,但它似乎沒有工作出於某種原因。 – user398341 2011-06-06 23:29:39

+0

你可以指定你的意思是不行嗎?你是否收到任何錯誤或者只是你沒有得到預期的結果?查詢運行時沒有任何錯誤。你必須調整它以適應你對周圍測試的需求。 – 2011-06-06 23:31:45