2013-02-27 204 views
-1

首先對不起的,我的英語...搜索php + mysql的關鍵詞?

我對數據庫中的標籤字段,我正在尋找像

SELECT * FROM table WHERE tags LIKE '%$keyword%' and tags LIKE '%$keyword%' 

我單獨由像空間標籤;

america england france 

我想告訴你,比如我的表結構

id | title | tags 

1 title1 america france 
2 title2 american english 
3 title3 england french 

當我要搜索「美國」

結果TITLE1和標題2,因爲美國美國標籤看起來像是相同的 字..

我怎樣才能讓他們獨一無二?當我搜索了美國,結果應該是唯一TITLE1 ...

感謝您的幫助,希望你能理解我的問題..有一個愉快的一天

編輯:

由於阿卡姆他寫的解決方案

+1

你可以簡單地使用'標籤'關鍵字%''添加一個空格? – 2013-02-27 20:59:26

+1

謝謝你,他的工作..有一個愉快的一天 – OMahoooo 2013-02-27 21:11:33

+1

這是一個糟糕的表結構。你應該規範設計。每個標記都在其OWN記錄中。 – 2013-02-27 21:26:37

回答

1

你可以使用這樣的事情:

SELECT * 
FROM tbl 
WHERE CONCAT(' ', tags, ' ') LIKE CONCAT('% ', 'america', ' %') 

請參閱小提琴here

+0

,如果相關標籤位於字段的開始或結尾,並且沒有前導/尾隨空格,則會失敗。 – 2013-02-27 21:27:00

+0

@MarcB我在LIKE的兩邊添加了一個前導/尾隨空格,我不認爲它會失敗 – fthiella 2013-02-27 21:29:58

0

你也可以使用MySQL的REGEXP來代替LIKE,使用字邊界修飾符來匹配整個單詞。您的查詢會是這個樣子:

SELECT * FROM table WHERE tags REGEXP '[[:<:]]$keyword[[:>:]]'; 

這有讓額外的獎勵,你尋找符合一組給定的在一個單一的查詢標籤的任何(或全部)如果你需要在該行:

SELECT * FROM table WHERE tags REGEXP '[[:<:]]$keyword_one[[:>:]]|[[:<:]]$keyword_two[[:>:]]' 

注意在正規表達式條件兩個表達式之間的管道|字符,這意味着它會匹配符合這些標記中的至少一個的任何記錄。

我沒有親自測試這種方法的性能,但在其他StackOverflow的帖子已閱讀,它是非常相當於LIKE在開始時%通配符(因爲這類型的查詢將會導致MySQL的不使用索引)。所以我想這對你來說是最好的選擇。

更多的信息在這裏:http://dev.mysql.com/doc/refman/5.1/en/regexp.html