Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL选择LIKE或REGEXP来匹配一条记录中的多个单词_Mysql_Regex_Select_Sql Like - Fatal编程技术网

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

MySQL选择LIKE或REGEXP来匹配一条记录中的多个单词,mysql,regex,select,sql-like,Mysql,Regex,Select,Sql Like,字段表名称包含“手写笔照片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

字段
名称
包含“手写笔照片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%'
您还可以使用:

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
操作符,因此您的查询类似于:
从bucketname类似“触笔2100”的桶中选择*

我在regexp方面不是很强,所以我希望表达式是正确的

编辑
RegExp应该是:

SELECT * FROM buckets WHERE bucketname RLIKE '(?=.*Stylus)(?=.*2100)'
有关MySql regexp支持的更多信息:

正确的解决方案是全文搜索(如果可以使用)

这几乎满足了您的需求:

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)+.*';

但这也将与“210020100”相匹配,这并不好。

您需要这样做

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


假设您的搜索是
触控笔照片2100
。请尝试以下示例,使用
RLIKE

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

另一种方法是使用
FULLTEXT
索引
bucketname
匹配。。。对照
语句中的
语法,选择
语句。因此,要重新编写上面的示例

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

谢谢,但是如果我搜索“Photo Stylus 2100”,我就不会得到这样的结果了。哈哈!好的,在问题“如何通过搜索‘Stylus 2100’来选择记录?”中没有指定该要求。我知道这个问题很老,但这不是最有效的解决方案吗?据我所知,这将匹配
光笔2100
。它将匹配
anything
后接
Stylus
后接
anything
后接
2100
后接
anything
。如果有人不同意,请告诉我原因,因为这意味着我从根本上误解了like表达式。@RTF我有点晚了,但%在Regex中是like+,而不是*。它匹配的是某些东西,而不是任何东西,因此不会匹配
光笔2100
,但会匹配
光笔2100x
@tjbp-错误
LIKE的
%
与空字符串匹配。因此,它本质上与RLIKE的
*
相同。梅尔文的回答站得住脚;阿莱西奥的第一个评论是错误的。测试起来很简单:
选择像“%Stylus%2100%”这样的“Photo Stylus 2100”
返回
1
(意思是
true
)。谢谢,这样我就不会得到“HP Laserjet 2100”。如果我的例子不是最好的,很抱歉。这里的一个回答者比较了LIKE/REGEX性能,发现LIKE性能更好,仅供参考:@Amalgovinus谢谢你的链接,我不会这么想的。。很高兴知道:)如果我有3个单词怎么办?@Florin在第一个查询中
+
指出任何字符(1个或更多)在Stylus和2100之间如果你想添加EPSON,它将是
EPSON.+'Stylus.+2100
在第二个查询中,你只需要添加一个新的
,在WHERE子句中,这个正则表达式做了一些不同的事情:它获取任何包含“Stylus”或“2100”的内容,不一定两者都有。我已经改进了我的regexp。我正在搜索一个只使用regexp的解决方案,这个技巧成功了^^^,在2()之间添加了一个
,就像这样
RLIKE'(?=.*Stylus)|(?=.*2100)
将给出单独的结果-->只使用Stylus的行、只使用2100的行或同时使用这两个行。。。但不一定是同一排的2…你试过这个吗?从来没有听说过MySql正则表达式支持lookarounds。第二个问题是允许使用愚蠢的
手写笔21002100
——为什么要使用
+
?警告:这个问题是关于两个单词以特定顺序出现的。大多数答案不允许匹配“2100触笔”。