感谢您阅读本文。希望您能够帮助我。
当我有这些行值的Mysql表
多个单词的反向匹配
id |搜索
========
1 |蝴蝶
2 |美国
3 |美国之鸟
4 |美国蝴蝶
无论搜索词的数量或顺序如何,我该如何判断哪些行在字符串“搜索”中出现的所有单词都是“美国蝴蝶”。
(我想在这个例子中检索1,2和4) 我现在使用一个编码循环来解决这个问题,很高兴用mysql来修复它更高效。我尝试了全文搜索和正则表达式,但都完好无损。 TX。
感谢您阅读本文。希望您能够帮助我。
当我有这些行值的Mysql表
多个单词的反向匹配
id |搜索
========
1 |蝴蝶
2 |美国
3 |美国之鸟
4 |美国蝴蝶
无论搜索词的数量或顺序如何,我该如何判断哪些行在字符串“搜索”中出现的所有单词都是“美国蝴蝶”。
(我想在这个例子中检索1,2和4) 我现在使用一个编码循环来解决这个问题,很高兴用mysql来修复它更高效。我尝试了全文搜索和正则表达式,但都完好无损。 TX。
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
如果我不是失去了一些东西:)
编辑:我失去了一些东西:(
这里有一个方法,我实验过(虽然不非常高效):
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;
这并没有给我的结果集我想要的。我现在没有多少时间来研究这个问题,但我想提一下这种方法,以防其他人想要加入并完成解决难题。如果不是的话,我会在今天晚些时候或明天再试一次。
嗨马特,我真的很喜欢你的聪明的做法。但是你不认为这种方法会产生一个缓慢的查询吗?嵌套也将依赖于代码来产生正确的查询。我仍然希望找到一个独立于代码的解决方案。 :-) – wikkie 2010-10-27 15:23:03
我同意,它可能不是最高性能的查询,但性能可能是可以接受的。诸如ibatis/mybatis(http://www.mybatis.org/java.html)之类的持久性框架可用于生成动态查询,如代码之外的这种动态查询。 – 2010-10-28 08:03:24
嵌套替换,没有子查询。
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
短语中添加了空格挡板以解释第一个和最后一个单词。
哇,快速反应,谢谢!我尝试了你的建议。你的第一个SELECT只返回记录1和2,但我也想检索4(字符串中出现'america'和'butterflies')。第二个SELECT返回所有记录,但我不想记录3(字符串中不会出现“鸟”)。任何想法如何调整正则表达式? – wikkie 2010-10-22 14:02:52
现在我意识到你想要什么。将尽快与解决方案来:) – 2010-10-22 14:10:03
好吧,再试一次,现在查询不返回任何记录;它要求包含所有单词的记录(+美洲的蝴蝶+),并且没有记录包含所有单词。将AND更改为OR并不好(再次返回所有记录)。 – wikkie 2010-10-22 14:21:10