感谢您阅读本文。希望您能够帮助我。
当我有一个包含这些行值的 Mysql 表时
编号| 搜索
========
1| 蝴蝶
2| 美国
3| 美国之鸟
4| 美国蝴蝶
无论搜索词的数量或顺序如何,我如何判断哪些行包含字符串“美国蝴蝶”中出现的“搜索”列中的所有词。
(我想在这个例子中检索 1,2 和 4)我现在使用编码循环来解决这个问题,如果用 mysql 更有效地修复它会很好。我尝试了全文搜索和正则表达式,但完全卡住了。德克萨斯州。
嵌套替换,没有子查询。
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
说明第一个和最后一个单词。
这是我尝试过的一种方法(虽然不是很有效):
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;
这并没有给我想要的结果集。我现在没有时间研究这个问题,但我想提一下这种方法,以防其他人想插话并完成解决难题。如果没有,我将在今天晚些时候或明天尝试对此进行更多研究。
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 :(