2012-02-24 67 views
0

我有一個MySQL表,如關鍵字的列表:MySQL查詢來匹配關鍵字句在外地

id | keywords 
---+-------------------------------- 
1 | apple, oranges, pears 
2 | peaches, pineapples, tangerines 

我試圖找出如何使用的輸入字符串來查詢該表: 約翰喜歡吃蘋果

是否有一個MySQL查詢類型,可以查詢一個字段與一個句子,並返回結果(在我的例子中,記錄#1)?

+0

你的生活結合起來會如果你可以將你的多值關鍵字分成不同的行,這會變得非常容易。 – northpole 2012-02-24 03:48:38

+0

非常真實,我爲其他應用程序做了這個但它不是真正必要的,只需要一個快速簡單的方法,如下面的答案 – Joe 2012-02-24 03:51:11

回答

2

一種方法可以將apple, oranges, pears轉換爲apple|oranges|pears並使用RLIKE(即正則表達式)來匹配它。

例如,'約翰喜歡吃蘋果'與正則表達式'apple | orange |梨'相匹配。

首先,將'apple,oranges,pear'轉換爲正則表達式,用'|'替換所有','使用REPLACE。然後使用RLIKE來選擇匹配的關鍵字條目:

SELECT * 
FROM keywords_table 
WHERE 'John liked to eat apples' RLIKE REPLACE(keywords,', ','|'); 

但是這並不取決於你用逗號分開是一致的(即如果有一行看起來像apples,oranges這將無法工作作爲REPLACE取代了逗號後面加一個空格(根據你的榜樣行)。

我也並不認爲它會擴展得非常好。

而且,如果你有一個像一個句子「約翰喜歡吃菠蘿」 ,它會匹配上面的兩行(因爲它有'apple'),然後你可以嘗試添加正則表達式的字邊界(即WHERE $sentence RLIKE '[[:<:]](apple|oranges|pears)[[:>:]]'),但是當你有複數時('蘋果'不匹配'[wordboundary] apple [wordboundary]'),這會搞砸匹配。

+0

這實際上對我來說效果很好,謝謝! – Joe 2012-02-24 03:49:52

+0

+1我不知道這甚至是一個選項。做得很好!!! – northpole 2012-02-24 03:57:07

0

我不知道任何直接的解決方案,該類型的查詢。但Full Text Search是一種可能性。如果您在感興趣的領域有全文索引,那麼在句子中的每個單詞(雖然我認爲OR操作符被隱含)之間搜索OR會找到該記錄...但它也可能找到比您想要的更多太。

0

我真的不認爲你正在尋找的是完全可能的,但你可以看看全文搜索或SOUNDEX。 SOUNDEX,例如,可以這樣做:

WHERE SOUNDEX(sentence) = SOUNDEX('%'+keywords+'%'); 

我從來沒有嘗試過在這種情況下,但你應該讓我知道它是如何工作的。

0

存儲逗號分隔的數據是不太理想的。
如果分手了「約翰喜歡吃蘋果」到個別單詞的字符串,你可以使用FIND_IN_SET operator

WHERE FIND_IN_SET('apple', t.keywords) > 0 

的表現不會太好了 - 這個操作是更適合Full Text Search

2

希望這不是比你需要的更抽象,但也許是做這件事的好方法。 我沒有測試過這個,但我認爲它會起作用。如果你可以使用PHP,您可以使用str_replace函數打開空間爲keyword LIKE '%apple%'

$sentence = "John liked to eat apples"; 

$sqlversion = str_replace(" ","%' OR Keyword like '%",$sentence); 

$finalsql = "%".$sqlversion."%"; 

上面會迴應:

%John%' OR Keyword like '%liked%' OR Keyword like '%to%' OR Keyword like '%eat%' OR Keyword like '%apples% 

然後,只需用你的SQL語句

SQL ="SELECT * 
FROM keywords_table 
WHERE Keyword like" . $finalsql; 
+0

不是用SQL來完成,而是一個很好的解決方案。如果php是一個選項。 – 2015-10-08 03:16:41

+0

@winner_joiner謝謝,是的,我需要在我的SQL技能上工作一些。它應該更像$ sql =「... WHERE關鍵字」。 $ finalsql; – 2015-10-08 05:22:55