多个单词的反向匹配

时间:2010-10-22 13:37:23

标签: mysql select words

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

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

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

无论搜索词的数量或顺序如何,我怎么知道哪些行包含在“美国蝴蝶”字符串中出现的“搜索”列中的所有单词。

(我想在此示例中检索1,2和4) 我现在使用编码循环来解决这个问题,用mysql修复它会更好。我尝试了全文搜索和正则表达式但是完全卡住了。 TX。

3 个答案:

答案 0 :(得分: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

我在要搜索的单词中添加了书挡空格,以确保您不会与单词的中间位置匹配(例如'''中的'''''。此外,我在search短语中添加了空间书挡以说明第一个和最后一个单词。

答案 1 :(得分: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

如果我没有遗漏某些东西:)

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

答案 2 :(得分: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;

这没有给我我想要的结果集。我现在还没有时间研究这个问题,但是我想提一下这种方法,以防其他人想要插入并完成拼图。如果没有,我会在今天或明天稍后再试一下。