15

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)

0

5 Answers 5

14

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)"
Sign up to request clarification or add additional context in comments.

Comments

1

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 expressions are usually slower):

SELECT * FROM myTable
WHERE INSTR(title, "dog") AND INSTR(title, "cat") AND INSTR(title, "mouse");

Comments

0

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"

Comments

0

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);

Comments

0

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.*';

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.