我有一個MySQL表,如關鍵字的列表:MySQL查詢來匹配關鍵字句在外地
id | keywords
---+--------------------------------
1 | apple, oranges, pears
2 | peaches, pineapples, tangerines
我試圖找出如何使用的輸入字符串來查詢該表: 約翰喜歡吃蘋果
是否有一個MySQL查詢類型,可以查詢一個字段與一個句子,並返回結果(在我的例子中,記錄#1)?
我有一個MySQL表,如關鍵字的列表:MySQL查詢來匹配關鍵字句在外地
id | keywords
---+--------------------------------
1 | apple, oranges, pears
2 | peaches, pineapples, tangerines
我試圖找出如何使用的輸入字符串來查詢該表: 約翰喜歡吃蘋果
是否有一個MySQL查詢類型,可以查詢一個字段與一個句子,並返回結果(在我的例子中,記錄#1)?
一種方法可以將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]'),這會搞砸匹配。
我不知道任何直接的解決方案,該類型的查詢。但Full Text Search是一種可能性。如果您在感興趣的領域有全文索引,那麼在句子中的每個單詞(雖然我認爲OR操作符被隱含)之間搜索OR
會找到該記錄...但它也可能找到比您想要的更多太。
我真的不認爲你正在尋找的是完全可能的,但你可以看看全文搜索或SOUNDEX。 SOUNDEX,例如,可以這樣做:
WHERE SOUNDEX(sentence) = SOUNDEX('%'+keywords+'%');
我從來沒有嘗試過在這種情況下,但你應該讓我知道它是如何工作的。
存儲逗號分隔的數據是不太理想的。
如果分手了「約翰喜歡吃蘋果」到個別單詞的字符串,你可以使用FIND_IN_SET operator:
WHERE FIND_IN_SET('apple', t.keywords) > 0
的表現不會太好了 - 這個操作是更適合Full Text Search。
希望這不是比你需要的更抽象,但也許是做這件事的好方法。 我沒有測試過這個,但我認爲它會起作用。如果你可以使用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;
不是用SQL來完成,而是一個很好的解決方案。如果php是一個選項。 – 2015-10-08 03:16:41
@winner_joiner謝謝,是的,我需要在我的SQL技能上工作一些。它應該更像$ sql =「... WHERE關鍵字」。 $ finalsql; – 2015-10-08 05:22:55
你的生活結合起來會如果你可以將你的多值關鍵字分成不同的行,這會變得非常容易。 – northpole 2012-02-24 03:48:38
非常真實,我爲其他應用程序做了這個但它不是真正必要的,只需要一個快速簡單的方法,如下面的答案 – Joe 2012-02-24 03:51:11