我正在建立一个网站,要求包含多个单词,但不包括单词,还包括较长的短语,但不包括其中较短的短语。
例如:
搜索“面包”应该返回包含“面包”的结果,而不是“面包”或“读取”。
搜索“平装书”应该返回带有“平装书”的结果,而不是“平装书”或“书籍”。
我尝试的查询是:
SELECT * FROM table WHERE (field LIKE '%breads%') AND (field NOT LIKE '%bread%')
...虽然有“面包”和“面包”的记录,但显然没有结果。
我理解为什么这个查询失败了(我告诉它要包含和排除相同的字符串)但我想不出适用于代码的正确逻辑以使其工作。
答案 0 :(得分:2)
您应该考虑使用FULL TEXT SEARCH。
这将解决您的面包/阅读问题。
我认为在这里使用通配符是没用的。假设您使用的是'%read%'
,现在这也会返回bread
,breads
等,这就是我推荐Full Text Search
答案 1 :(得分:2)
搜索%breads%
将永远不会返回bread
或read
,因为's'是匹配所需的字符。所以只需删除和子句:
SELECT ... WHERE (field LIKE '%breads%')
SELECT ... WHERE (field LIKE '%paperback book%');
答案 2 :(得分:0)
使用MySQL,你可以使用REGEXP而不是像你可以更好地控制你的查询......
SELECT * FROM table WHERE field REGEXP '\s+read\s+'
这至少可以强制执行查询周围的单词边界,并且可以更好地控制匹配 - 但是性能下降会受到影响。