MySQL SELECT LIKE或REGEXP匹配一条记录中的多个单词

时间:2012-02-01 16:31:11

标签: mysql regex select sql-like

字段tablename包含'Stylus Photo 2100'并包含以下查询

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

我没有结果。我当然会搜索

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

如何通过搜索“Stylus 2100”来选择记录?

谢谢

8 个答案:

答案 0 :(得分:96)

如果你知道你的话的顺序......你可以使用:

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

您也可以使用:

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

答案 1 :(得分:28)

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

在MySql中有RLIKE运算符,因此您的查询类似于:
<删除> SELECT * FROM buckets WHERE bucketname RLIKE 'Stylus|2100'
我在正则表达式方面不是很强,所以我希望表达式没问题。

修改
RegExp应该是:

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

更多关于MySql正则表达式的支持:
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp

答案 2 :(得分:18)

您可以使用%

替换每个空格
SELECT `name` FROM `table` WHERE `name` LIKE '%Stylus%2100%'

答案 3 :(得分:5)

正确的解决方案是FullText搜索(如果您可以使用它)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)+.*';

但这也符合&#34; 210021002100&#34;这不是很好。

答案 4 :(得分:3)

查看http://www.techonthenet.com/sql/like.php

用LIKE'%Stylus 2100%'你问一个包含'Stylus 2100'的字符串,'Stylus Photo 2100'不包含那个字符串,里面有'Photo';

答案 5 :(得分:1)

您需要执行以下操作

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

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

答案 6 :(得分:0)

假设您的搜索是stylus photo 2100。尝试使用RLIKE的以下示例。

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

编辑

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

SELECT * FROM `buckets` WHERE MATCH(`bucketname`) AGAINST (REPLACE('stylus photo 2100', ' ', ','));

答案 7 :(得分:0)

name的{​​{1}}中选择table,例如'%Stylus%2100%'