4

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

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

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

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

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

4

3 回答 3

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

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

于 2010-11-10T17:11:23.390 回答
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;

这并没有给我想要的结果集。我现在没有时间研究这个问题,但我想提一下这种方法,以防其他人想插话并完成解决难题。如果没有,我将在今天晚些时候或明天尝试对此进行更多研究。

于 2010-10-27T00:14:42.203 回答
0
SELECT * 
FROM table_name 
WHERE search LIKE '%butterflies%' 
  AND search LIKE '%of%' 
  AND search LIKE '%america%';

or

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

If i am not missing something :)

Edit: I was missing something :(

于 2010-10-22T13:43:56.743 回答