使用 MySQLSELECTLike 或 REGEXP 来匹配一条记录中的多个单词

字段 table.name包含“ Stylus Photo 2100”和以下查询

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus 2100%'

我没有得到结果,当然如果我搜索的话我会的

SELECT `name` FROM `table` WHERE `name` LIKE '%Photo 2100%'

如何搜寻「手写笔2100」以选取纪录?

谢谢

203273 次浏览

如果你知道你的语序,你可以用:

SELECT `name` FROM `table` WHERE `name` REGEXP 'Stylus.+2100'

你也可以使用:

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%' AND `name` LIKE '%2100%'

您只需用 %替换每个空格即可

SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%'

我认为最好的解决方案是使用正则表达式。这是最干净,也可能是最有效的。所有常用的 DB 引擎都支持正则表达式。

在 MySql 中有一个 RLIKE操作符,因此您的查询类似于:
SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus|2100'
我在 regexp 方面不是很强,所以我希望这个表达没问题。

剪辑
RegExp 应该是:

SELECT * FROM buckets WHERE bucketname RLIKE '(?=.*Stylus)(?=.*2100)'

更多关于 MySql regexp 支持的资料:
Http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp

正确的解决方案是全文搜索(如果可以使用的话) https://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

这几乎达到了你想要的效果:

SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus|2100)+.*(Stylus|2100)+';


SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*(Stylus|2100|photo)+.*';

但这也将匹配“210021002100”,这不是很好。

你需要做这样的事情,

SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus.*2100';

或者

SELECT * FROM buckets WHERE bucketname RLIKE '(Stylus)+.*(2100)+';

假设您的搜索是 stylus photo 2100

SELECT * FROM `buckets` WHERE `bucketname` RLIKE REPLACE('stylus photo 2100', ' ', '+.*');

剪辑

另一种方法是在 SELECT语句中对 bucketnameMATCH ... AGAINST语法使用 FULLTEXT索引。重写上面的例子。

SELECT * FROM `buckets` WHERE MATCH(`bucketname`) AGAINST (REPLACE('stylus photo 2100', ' ', ','));
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus % 2100%'