我使用MySql REGEXP:
SELECT * FROM myTable
WHERE title REGEXP "dog|cat|mouse";
数据集很小,所以我不关心性能。而且我更喜欢使用LIKE表示法,因为我不必连接一堆“LIKE”语句。
但是,上述表示法使用逻辑OR运算符。是否有逻辑AND运算符,因此只有包含所有关键字的行匹配?
(我正在使用InnoDB所以全文搜索不是一个选项)
答案 0 :(得分:12)
除了连接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)"
答案 1 :(得分:0)
AND
操作只能由mysql-AND访问:
WHERE title REGEXP 'dog' AND title REGEXP 'cat' AND title REGEXP 'mouse'
这只会显示所有关键字都在标题字段中的条目。像
title = "this is about mouse, cat and dog"
答案 2 :(得分:0)
您可以在它们之间添加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");
答案 3 :(得分:0)
您可以在布尔模式下使用全文搜索:
SELECT * FROM table WHERE MATCH(colmun_name) AGAINST('+dogs +cat' IN BOOLEAN MODE);
您必须先将表编入索引:
ALTER TABLE table ADD FULLTEXT(column_name);
答案 4 :(得分:0)
如果标题包含所有搜索词,例如:
Anything mouse anything cat anything dog anything
然后,所有搜索词都将以任意顺序(例如狗,猫和老鼠)以三个重复的标题显示。
Anything mouse anything cat anything DOG anything
Anything mouse anything CAT anything dog anything
Anything MOUSE anything cat anything dog anything
因此,您可以在不将AND与以下各项串联的情况下进行操作:
SELECT * FROM myTable WHERE REPEAT(title,3) RLIKE '.*dog.*cat.*mouse.*';