感谢您阅读本文。希望你能帮助我。
当我有一个包含这些行值的Mysql表时
ID |搜索
========
1 |蝴蝶
2 |美国
3 |美国鸟类
4 |美国蝴蝶
无论搜索词的数量或顺序如何,我怎么知道哪些行包含在“美国蝴蝶”字符串中出现的“搜索”列中的所有单词。
(我想在此示例中检索1,2和4) 我现在使用编码循环来解决这个问题,用mysql修复它会更好。我尝试了全文搜索和正则表达式但是完全卡住了。 TX。
答案 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;
这没有给我我想要的结果集。我现在还没有时间研究这个问题,但是我想提一下这种方法,以防其他人想要插入并完成拼图。如果没有,我会在今天或明天稍后再试一下。