2010-10-22 119 views
4

感谢您阅读本文。希望您能够帮助我。

当我有这些行值的Mysql表
多个单词的反向匹配

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

无论搜索词的数量或顺序如何,我该如何判断哪些行在字符串“搜索”中出现的所有单词都是“美国蝴蝶”。

(我想在这个例子中检索1,2和4) 我现在使用一个编码循环来解决这个问题,很高兴用mysql来修复它更高效。我尝试了全文搜索和正则表达式,但都完好无损。 TX。

回答

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

SELECT * 
FROM table_name 
WHERE search REGEXP 'butterflies|of|america'; // not working 

如果我不是失去了一些东西:)

编辑:我失去了一些东西:(

+0

哇,快速反应,谢谢!我尝试了你的建议。你的第一个SELECT只返回记录1和2,但我也想检索4(字符串中出现'america'和'butterflies')。第二个SELECT返回所有记录,但我不想记录3(字符串中不会出现“鸟”)。任何想法如何调整正则表达式? – wikkie 2010-10-22 14:02:52

+0

现在我意识到你想要什么。将尽快与解决方案来:) – 2010-10-22 14:10:03

+0

好吧,再试一次,现在查询不返回任何记录;它要求包含所有单词的记录(+美洲的蝴蝶+),并且没有记录包含所有单词。将AND更改为OR并不好(再次返回所有记录)。 – wikkie 2010-10-22 14:21:10

0

这里有一个方法,我实验过(虽然不非常高效):

select search, replace(filtered, 'butterflies', '') as filtered from (
    select search, replace(filtered, 'of', '') as filtered from (
     select search, replace(search, 'america', '') as filtered from table_name a 
    ) b 
) c; 

该查询会给你类似如下:

+---------------------+----------+ 
| search    | filtered | 
+---------------------+----------+ 
| butterflies   |   | 
| america    |   | 
| birds of america | birds | 
| america butterflies |   | 
+---------------------+----------+ 

的最后一块,使这项工作是给我带来些麻烦,不过......你需要一个where子句将返回是“空的所有行“(即只包含空格字符)。

这将过滤掉第三行并返回你想要的结果集。但是,我无法使用trim()来使用它,我不知道为什么。

例如,我想:

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

这并没有给我的结果集我想要的。我现在没有多少时间来研究这个问题,但我想提一下这种方法,以防其他人想要加入并完成解决难题。如果不是的话,我会在今天晚些时候或明天再试一次。

+0

嗨马特,我真的很喜欢你的聪明的做法。但是你不认为这种方法会产生一个缓慢的查询吗?嵌套也将依赖于代码来产生正确的查询。我仍然希望找到一个独立于代码的解决方案。 :-) – wikkie 2010-10-27 15:23:03

+0

我同意,它可能不是最高性能的查询,但性能可能是可以接受的。诸如ibatis/mybatis(http://www.mybatis.org/java.html)之类的持久性框架可用于生成动态查询,如代码之外的这种动态查询。 – 2010-10-28 08:03:24

1

嵌套替换,没有子查询。

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 

我加bookending空间的话来搜索,以确保您不匹配对单词的中间(例如“的”中“咖啡”)。此外,我在search短语中添加了空格挡板以解释第一个和最后一个单词。