我有一个mysql表,其中包含以下关键字列表:
id | keywords
---+--------------------------------
1 | apple, oranges, pears
2 | peaches, pineapples, tangerines
我正在尝试弄清楚如何使用以下输入字符串查询此表: 约翰喜欢吃苹果
是否有一个mysql查询类型可以使用句子查询字段并返回结果(在我的示例中,记录#1)?
答案 0 :(得分:2)
一种方法是将apple, oranges, pears
转换为apple|oranges|pears
并使用RLIKE
(即正则表达式)来匹配它。
例如,'John喜欢吃苹果'与正则表达式'apple | orange | pears'匹配。
首先,要将'apple,oranges,pears'转换为正则表达式,请将所有','替换为'|'使用REPLACE
。然后使用RLIKE
选择匹配的关键字条目:
SELECT *
FROM keywords_table
WHERE 'John liked to eat apples' RLIKE REPLACE(keywords,', ','|');
但这取决于你的逗号分隔是否一致(即如果有一行看起来像apples,oranges
这将无效,因为REPLACE
会替换逗号后跟空格(如根据您的示例行。)
我也认为它不会很好地扩展。
而且,如果你有一个像'约翰喜欢吃菠萝'这样的句子,它会匹配上面的两行(因为它里面有'苹果')。然后你可以尝试在正则表达式中添加单词边界(即WHERE $sentence RLIKE '[[:<:]](apple|oranges|pears)[[:>:]]'
),但是如果你有复数('apples'不匹配'[wordboundary] apple [wordboundary]'),这会搞砸匹配。 / p>
答案 1 :(得分: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;
答案 2 :(得分:0)
我不知道对该类型查询的任何直接解决方案。但是Full Text Search是可能的。如果您对感兴趣的字段有全文索引,那么在句子中的每个单词之间使用OR
进行搜索(虽然我认为隐含了OR运算符)会找到该记录...但它也可能找到比你想要的还要多。
答案 3 :(得分:0)
我真的不认为你想要的是完全可能的,但你可以查看全文搜索或SOUNDEX。例如,SOUNDEX可以做类似的事情:
WHERE SOUNDEX(sentence) = SOUNDEX('%'+keywords+'%');
我从来没有在这种情况下尝试过,但你应该让我知道它是如何运作的。
答案 4 :(得分:0)
存储逗号分隔的数据是......不太理想 如果你将“约翰喜欢吃苹果”的字符串分成单个单词,你可以使用FIND_IN_SET operator:
WHERE FIND_IN_SET('apple', t.keywords) > 0
性能不会很好 - 此操作更适合Full Text Search。