字段table
。name
包含"Stylus Photo 2100",并带有以下查询
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus 2100%'
我没有结果。如果我搜索,我当然会
SELECT `name` FROM `table` WHERE `name` LIKE '%Photo 2100%'
如何通过搜索"Stylus 2100"来选择记录?
感谢
如果你知道单词的顺序。。你可以使用:
SELECT `name` FROM `table` WHERE `name` REGEXP 'Stylus.+2100'
你也可以使用:
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%' AND `name` LIKE '%2100%'
我认为最好的解决方案是使用正则表达式。它是最干净的,可能也是最有效的。所有常用的数据库引擎都支持正则表达式。
在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
您可以用%
替换每个空间
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%'
正确的解决方案是全文搜索(如果可以使用的话)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
。请尝试以下使用RLIKE
的示例。
SELECT * FROM `buckets` WHERE `bucketname` RLIKE REPLACE('stylus photo 2100', ' ', '+.*');
编辑
另一种方法是在bucketname
上使用FULLTEXT
索引,在SELECT
语句中使用MATCH ... AGAINST
语法。所以重写上面的例子。。。
SELECT * FROM `buckets` WHERE MATCH(`bucketname`) AGAINST (REPLACE('stylus photo 2100', ' ', ','));
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus % 2100%'