2013-07-16 97 views
0

我正試圖從mysql數據庫中檢索條目,其中數據庫中的關鍵字對應於文章的標題或文章的標籤。目前,我正在使用instr,但這並不夠具體,因爲我發現爲更短的關鍵字檢索到太多不相關的結果 - 即。我嘗試檢索標題或標籤列表中包含「藝術」字樣的條目,但最終會檢索其他條目,例如「文章」。MYSQL - 僅檢索標籤搜索中的全部單詞

我有以下表結構。數據庫有一個預定義的標籤列表。每篇文章的類別被賦予了許多的標籤從主標籤列表:

tags_tbl (overall tags list) 

    tt_tag_id (pk) int 

    tt_tag varchar 

category_tag_assignments_tbl (the category which a tag is assigned to) 

    cta_id (pk) int 

    cta_tag_for_id (fk to tags_tbl.tt_tag_id) int 

    cat_for_id (fk to category table) int 

我的查詢是:

SELECT * FROM tags_tbl INNER JOIN category_tag_assignments_tbl ON tags_tbl.tt_tag_id = category_tag_assignments_tbl.cta_tag_for_id WHERE instr('The Article Title' , tags_tbl.tt_tag) > 0 OR instr('these,are,article,tags' , tags_tbl.tt_tag) > 0 

我怎樣才能讓這個我都只有不到文章標題搜索,在文章標籤中,對於一個完整的單詞,在沒有檢索到可能出現字符串的較長單詞的同時,還要考慮到標籤列表由不帶空格的逗號分隔的事實?我想盡量減少php處理的數量 - 我無法控制標題和標籤的實際表示,因爲這些由外部源提供,除非我提前使用php修改它們。

我正在考慮合併下面的正則表達式,我在這裏找到了stackoverflow,但我不知道如何應用它在這種情況下,因爲我在我的搜索條件搜索(對不起笨拙的措辭,我知道,但我想不出還有怎麼說吧):

WHERE tags_tbl.tt_tag REGEXP '[[:<:]]art[[:>:]]' 

謝謝!

回答

2

首先,您可以考慮以布爾模式進行全文搜索。這可能比任何基於字符串的解決方案都要好。

也就是說,你可以通過周圍的標籤和搜索字符串分隔符做你想要什麼:

SELECT * 
FROM tags_tbl INNER JOIN 
    category_tag_assignments_tbl 
    ON tags_tbl.tt_tag_id = category_tag_assignments_tbl.cta_tag_for_id 
WHERE concat(' ', 'The Article Title', ' ') like concat('%', tags_tbl.tt_tag, '%')OR 
     concat(',', 'these,are,article,tags', ',') like concat('%', tags_tbl.tt_tag, '%') 

最後一個表達式實際上可以通過使用find_in_set(),以下where條款被簡化

WHERE concat(' ', 'The Article Title', ' ') like concat('%', tags_tbl.tt_tag, '%')OR 
     find_in_set(tags_tbl.tt_tag, 'these,are,article,tags') > 0 

您實際上也可以將它用於第一個表達式 - 如果標題中有逗號,則可能非常方便:

WHERE find_in_set(tags_tbl.tt_tag, replace('The Article Title', ' ', ',') or 
     find_in_set(tags_tbl.tt_tag, 'these,are,article,tags') > 0; 
+0

謝謝Gordon Linoff。 concat的工作,因爲我希望它。謝謝。我也將更多地看布爾模式。謝謝! – user2287202