Logical AND operator in mySql REGEXP?

2020-02-10 18:16发布

I use MySql REGEXP:

SELECT * FROM myTable
WHERE title REGEXP "dog|cat|mouse";

The dataset is small, so I am not concerned about performance. And I prefer this over LIKE notation, because I do not have to concatenate a bunch of "LIKE" statements.

However, the above notation uses a logical OR operator. Is there a logical AND operator, so that only rows containing all of the keywords are matched?

(I am using InnoDB so fulltext search not an option)

标签: mysql regex
5条回答
The star\"
2楼-- · 2020-02-10 18:51

You can add several conditions with AND between them:

SELECT * FROM myTable
WHERE title REGEXP "dog" AND title REGEXP "cat" AND title REGEXP "mouse";

Maybe REGEXP is not necessary here and you may use INSTR instead (regular are usually slower):

SELECT * FROM myTable
WHERE INSTR(title, "dog") AND INSTR(title, "cat") AND INSTR(title, "mouse");
查看更多
我欲成王,谁敢阻挡
3楼-- · 2020-02-10 18:54

There's really no nice solution except concatenating ANDs:

SELECT * FROM myTable
WHERE title REGEXP "dog"
AND title REGEXP "cat"
AND title REGEXP "mouse"

The regular expression would otherwise look like this:

SELECT * FROM myTable
WHERE title REGEXP "(dog.*cat.*mouse)|(dog.*mouse.*cat)|(mouse.*dog.*cat)|(mouse.*cat.*dog)|(cat.*dog.*mouse)|(cat.*mouse.*dog)"
查看更多
唯我独甜
4楼-- · 2020-02-10 18:56

AND operation may be only accessible by the mysql-AND:

WHERE title REGEXP 'dog' AND title REGEXP 'cat' AND title REGEXP 'mouse'

this will only show those entries where all the keywords are in the title field. like

title = "this is about mouse, cat and dog"
查看更多
▲ chillily
5楼-- · 2020-02-10 19:05

You can use full text search in boolean mode:

SELECT * FROM table WHERE MATCH(colmun_name) AGAINST('+dogs +cat' IN BOOLEAN MODE);

You must index your table first:

ALTER TABLE table ADD FULLTEXT(column_name);
查看更多
家丑人穷心不美
6楼-- · 2020-02-10 19:09

If your title contains all the search terms, for example:

Anything mouse anything cat anything dog anything

Then you will have all the search terms in a three times repeated title in any order (for example dog, cat and mouse).

Anything mouse anything cat anything DOG anything

Anything mouse anything CAT anything dog anything

Anything MOUSE anything cat anything dog anything

So you can do this without concatenating ANDs with:

SELECT * FROM myTable WHERE REPEAT(title,3) RLIKE '.*dog.*cat.*mouse.*';

查看更多
登录 后发表回答