领域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”选择记录?
谢谢
领域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”选择记录?
谢谢
Answers:
好吧,如果您知道单词的顺序..您可以使用:
SELECT `name` FROM `table` WHERE `name` REGEXP 'Stylus.+2100'
您也可以使用:
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%' AND `name` LIKE '%2100%'
.+
指示手写笔和2100之间的任何字符(1个或多个),如果您想添加EPSON,它将EPSON.+'Stylus.+2100
在第二个查询中只需要AND
在WHERE子句中添加新
我认为最好的解决方案是使用正则表达式。它是最干净的,而且可能是最有效的。所有常用的数据库引擎都支持正则表达式。
在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%'
Photo Stylus 2100
。它将匹配,anything
然后是Stylus
,anything
然后是,2100
然后是anything
。如果有人不同意,请告诉我原因,因为这意味着我从根本上误解了类似表达式的内容。
Photo Stylus 2100
但会匹配Photo Stylus 2100x
。
LIKE's
%
匹配空字符串。因此,它基本上与相同RLIKE's
.*
。梅尔文的答案不变。阿莱西奥的第一句话是错误的。测试很简单: SELECT 'Photo Stylus 2100' LIKE '%Stylus%2100%';
返回1
(表示true
)。
正确的解决方案是全文搜索(如果可以使用的话)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)+';
StylusStylus 210021002100
-为什么要+
??
假设您的搜索是stylus photo 2100
。请尝试使用以下示例RLIKE
。
SELECT * FROM `buckets` WHERE `bucketname` RLIKE REPLACE('stylus photo 2100', ' ', '+.*');
编辑
另一种方法是在语句中使用FULLTEXT
索引bucketname
和MATCH ... AGAINST
语法SELECT
。所以要重写上面的例子...
SELECT * FROM `buckets` WHERE MATCH(`bucketname`) AGAINST (REPLACE('stylus photo 2100', ' ', ','));