我有一个类似于以下内容的数据库:
ID | TEXT
1 | I like to eat cheetos.
2 | There is a snake in my boots
3 | to eat is to like food
4 | The sun stopped setting, Rlyah Cthullhu!
5 | Beat the heat with icecram!
6 | Treat yourself!
7 | Eat at Joes!
我有一个mysqli查询,看起来有点像以下......
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '/(like)(eat)/');
我也尝试过如下:
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '/^(^like|^eat)/');
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '(like)(eat)');
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP '/(?=like)(?=eat)/');
这些都不匹配任何领域(我不知道为什么,据我所知,他们应该有效)。出于绝望,我试过......
SELECT `ID` FROM table WHERE `ID` > 0 AND (`TEXT` REGEXP 'like|eat');
当然是'或'而不是'和'匹配,它匹配1,3,5,6和7.
但我想要匹配的是1和3.
我做错了什么?
答案 0 :(得分:1)
将模式更改为
REGEXP '(\blike\b|\beat\b)')
基本上,(a|b|c)
会匹配主题中的a
或b
或c
。在每个单词之前和之后添加\b
(单词边界)可确保仅在单词边界内出现单词时生成匹配,即空格,换行符或其他分隔符。
In MySQL,转义的特殊字符会被自定义标记替换。对于字边界,请使用[[:<:]]
和[[:>:]]
REGEXP '([[:<:]]like[[:>:]]|[[:<:]]eat[[:>:]])')
答案 1 :(得分:1)
“OR”更简洁:
REGEXP '[[:<:]](like|eat)[[:>:]]'
对于“AND”:
REGEXP '[[:<:]]like[[:>:]]'
AND REGEXP '[[:<:]]eat[[:>:]]'
但是使用
,FULLTEXT
索引(也是“AND”)会快得多
MATCH (col) AGAINST ('+like +eat' IN BOOLEAN MODE)