Логический оператор И в mySql REGEXP?

Я использую MySql REGEXP:

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

Набор данных невелик, поэтому меня не касается производительности. И я предпочитаю эту запись LIKE, потому что мне не нужно конкатенировать кучу инструкций "LIKE".

Однако в приведенной выше нотации используется логический оператор OR. Существует ли логический оператор И, так что будут сопоставляться только строки, содержащие все ключевые слова?

(Я использую InnoDB, поэтому полнотекстовый поиск не является опцией)

Ответ 1

На самом деле нет хорошего решения, кроме конкатенации AND:

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

В противном случае регулярное выражение выглядит следующим образом:

SELECT * FROM myTable
WHERE title REGEXP "(dog.*cat.*mouse)|(dog.*mouse.*cat)|(mouse.*dog.*cat)|(mouse.*cat.*dog)|(cat.*dog.*mouse)|(cat.*mouse.*dog)"

Ответ 2

Операция

AND может быть доступна только для mysql-AND:

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

это отображает только те записи, где все ключевые слова находятся в поле заголовка. как

title = "this is about mouse, cat and dog"

Ответ 3

Вы можете добавить несколько условий с AND между ними:

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

Может быть, REGEXP здесь не нужен, и вы можете вместо этого использовать INSTR (обычные обычно медленнее):

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

Ответ 4

Вы можете использовать полнотекстовый поиск в логическом режиме:

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

Сначала вы должны индексировать свою таблицу:

ALTER TABLE table ADD FULLTEXT(column_name);