Mysql 多词反向匹配

Mysql 多词反向匹配,mysql,select,words,Mysql,Select,Words,谢谢你阅读这篇文章。希望你能帮助我。 当我有一个具有这些行值的Mysql表时 id|搜索 ========== 1|蝴蝶 2 |美国 3 |美洲鸟类 4 |美洲蝴蝶 我如何判断哪一行的“search”列中的所有单词都出现在字符串“butterflies of america”中,而不考虑搜索单词的数量或顺序 (我想在本例中检索1、2和4) 我现在使用一个编码的循环来解决这个问题,如果能用mysql更有效地解决这个问题就好了。我尝试了全文搜索和正则表达式,但完全卡住了。德克萨斯州 SELECT *

谢谢你阅读这篇文章。希望你能帮助我。

当我有一个具有这些行值的Mysql表时

id|搜索
==========
1|蝴蝶
2 |美国
3 |美洲鸟类
4 |美洲蝴蝶

我如何判断哪一行的“search”列中的所有单词都出现在字符串“butterflies of america”中,而不考虑搜索单词的数量或顺序

(我想在本例中检索1、2和4) 我现在使用一个编码的循环来解决这个问题,如果能用mysql更有效地解决这个问题就好了。我尝试了全文搜索和正则表达式,但完全卡住了。德克萨斯州

SELECT * 
FROM table_name 
WHERE search LIKE '%butterflies%' 
  AND search LIKE '%of%' 
  AND search LIKE '%america%';

如果我没有遗漏什么:)


编辑:我遗漏了一些东西:(

这里有一个我尝试过的方法(虽然不是很有效):

此查询将为您提供如下信息:

+---------------------+----------+
| search              | filtered |
+---------------------+----------+
| butterflies         |          |
| america             |          |
| birds of america    | birds    |
| america butterflies |          |
+---------------------+----------+
最后一项工作给了我一些麻烦,但是…您需要一个where子句,它将返回所有“空”行(即仅包含空白字符)

这将过滤掉第三行并返回您想要的结果集

例如,我尝试:

where length(trim(c.filtered)) = 0;

这并没有给我我想要的结果集。我现在没有更多的时间来研究这一点,但我想提到这种方法,以防其他人想插话并完成解谜。如果没有,我将在今天晚些时候或明天尝试进一步研究这一点。

嵌套替换,无子查询

SELECT id, search
FROM  a 
WHERE LENGTH( TRIM( 
REPLACE( REPLACE( REPLACE( 
CONCAT(  ' ', search,  ' ' ) ,  
' butterflies ',  ' ' ) ,  ' of ',  ' ' ) ,  ' america ',  ' ' ) ) ) = 0

        id  search
        1   butterflies
        2   america
        4   america butterflies

我在要搜索的单词中添加了书尾空格,以确保您与单词的中间部分不匹配(例如“咖啡”中的“of”)。此外,我在
搜索
短语中添加了空格bookends,以说明开头和结尾的单词。

哇,快速响应,谢谢!我尝试了您的建议。您的第一次选择仅返回记录1和2,但我也要检索记录4(字符串中同时出现“america”和“butterflies”)。第二次选择返回所有记录,但我不想要记录3(“birds”不出现在字符串中)。关于如何调整regexp有什么想法吗?现在我意识到了你想要的。希望很快会有解决方案:)好的,再试一次,现在查询不返回任何记录;它要求提供包含所有单词的记录(蝴蝶+美国),但没有一个记录包含所有单词。将AND改为OR没有任何好处(再次返回所有记录)。我不认为一个查询就可以做到这一点。存储过程可以完成这项工作,也可以只使用脚本来查找正确的记录。啊,我们的评论错了,好吧,我等一下:-)嗨,Matt,我真的很喜欢你聪明的方法。但是你不认为这个方法会产生一个缓慢的查询吗?嵌套还将依赖于代码来生成正确的查询。我仍然希望找到一个独立于代码的解决方案。:-)我同意,这可能不是性能最好的查询,但性能可能是可以接受的。可以使用诸如ibatis/mybatis()之类的持久性框架在代码之外生成这样的动态查询。
where length(trim(c.filtered)) = 0;
SELECT id, search
FROM  a 
WHERE LENGTH( TRIM( 
REPLACE( REPLACE( REPLACE( 
CONCAT(  ' ', search,  ' ' ) ,  
' butterflies ',  ' ' ) ,  ' of ',  ' ' ) ,  ' america ',  ' ' ) ) ) = 0

        id  search
        1   butterflies
        2   america
        4   america butterflies