Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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搜索精确的单词匹配?_Mysql_Select_Sql Like - Fatal编程技术网

MySQL-如何使用LIKE搜索精确的单词匹配?

MySQL-如何使用LIKE搜索精确的单词匹配?,mysql,select,sql-like,Mysql,Select,Sql Like,我正在使用此查询选择数据: mysql_query("SELECT * FROM products WHERE product_name LIKE '%".$search."%'"); 唯一的问题是,它有时选择的比我想要的更多 例如,我想选择产品“BLA”,但我的查询也选择产品“BLABLA”。明确地说,如果我想选择“产品1”,我不想让查询选择“产品11” 有人知道怎么处理吗 谢谢。删除LIKE关键字,并使用=进行精确匹配 编辑 不要忘记使用转义用户输入,否则如果有人在输入框中输入引号,您的查

我正在使用此查询选择数据:

mysql_query("SELECT * FROM products WHERE product_name LIKE '%".$search."%'");
唯一的问题是,它有时选择的比我想要的更多

例如,我想选择产品“BLA”,但我的查询也选择产品“BLABLA”。明确地说,如果我想选择“产品1”,我不想让查询选择“产品11”

有人知道怎么处理吗


谢谢。

删除
LIKE
关键字,并使用
=
进行精确匹配

编辑

不要忘记使用转义用户输入,否则如果有人在输入框中输入引号,您的查询将失败

$search=mysql_real_escape_string($search);
mysql_query("SELECT * FROM products WHERE product_name='".$search."'");

然后不要使用LIKE,而是搜索相等

顺便说一句,我希望您在查询中使用$search之前对其进行清理/转义

SELECT  *
FROM    products
WHERE   product_name = 'BLA'
将选择精确的
BLA

SELECT  *
FROM    products
WHERE   product_name LIKE 'BLA%'
将选择
blacket
BLACKBERRY
,但不选择
REBLAND

要选择
BLA
作为字符串的第一个单词,请使用:

SELECT  *
FROM    products
WHERE   product_name RLIKE '^Bla[[:>::]]'
        AND product_name LIKE 'Bla%'
如果在
product\u name
上有索引,则第二个条件可能会提高查询性能

如果您希望匹配精确的单词,请不要像使用那样使用

编辑:那就把事情弄清楚一点。只需在搜索词后添加一个空格。如果搜索词中始终有连字符(-),甚至可以添加连字符(-)

mysql_query("SELECT * FROM products WHERE product_name LIKE '".$search." -%'"); 

你只想搜索单词边界吗?如果是这样,粗略的版本可能是:

SELECT * FROM products WHERE product_name LIKE "% foo %";
或者你可以更聪明一点,用下面的
REGEXP

SELECT * FROM products WHERE product_name RLIKE "[[:<:]]foo[[:>:]]";
从产品名称类似于“[[::]”的产品中选择*;

尝试在查询中使用正则表达式

mysql_query("SELECT * FROM products WHERE product_name regexp '".$search."'");

我在谷歌上发现了这个问题,所以我想有些人可能仍然会偶然发现这个问题,所以这里是我非常不雅观的尝试:

SELECT * FROM products
WHERE product_name LIKE 'BLA %' #First word proceeded by more words
OR WHERE product_name LIKE '% BLA' #Last word preceded by other words
OR WHERE product_name LIKE '% BLA %' #Word in between other words
OR WHERE product_name = 'BLA'; #Just the word itself

不确定效率,或者这是否涵盖所有情况,所以如果这真的效率低下或太不雅观,请随意否决。

您可以像这样使用select查询,我也在cakePHP中使用它,这很有帮助

Select * from `users` where username COLLATE latin1_general_cs LIKE '%$email%'

尝试使用正则表达式:

SELECT 
    *
FROM
    `products`
WHERE
    product_name regexp '(^|[[:space:]])BLA([[:space:]]|$)';

如果要使用类似于
从MySql中搜索精确的单词匹配,请使用:

从tableName中选择*,其中columnName类似于'your_query';

好吧,这是您使用的预期结果,就像
一样,尝试使用
=
好吧,我没有清楚地表达自己,产品名称栏包含的单词比产品名称本身多得多。例如,可能有“Bla-50g”、“Bla-10g”、“Bla-5g”之类的东西,我想选择所有“Bla”,但不是“Blabla”。好吧,我没有清楚地表达自己,product_name(产品名称)列包含的单词比product_name(产品名称)本身多得多。例如,可能有“Bla-50g”、“Bla-10g”、“Bla-5g”之类的东西,我想选择所有“Bla”,但不是“Blabla”。好吧,我没有清楚地表达自己,product_name(产品名称)列包含的单词比product_name(产品名称)本身多得多。例如,可以有类似“Bla-50g”、“Bla-10g”、“Bla-5g”的东西,我想选择所有的“Bla”,但不选择“Blabla”。当然,可以有绝对的任何东西,所以这不起作用=/什么意思?什么都有可能?!如果您正在谈论连字符(-),只需删除它并留下空格。这将只匹配以“Bla”开头的单词,因此不会选择“Blabla”,而是选择“Bla-”或“Bla-Bla”。我只添加了连字符(-),因为你给出的例子都有连字符。我认为第一个不太好用,想想如果'foo'值!使用RLIKE的缺点是:“REGEXP和RLIKE运算符以字节方式工作,因此它们不是多字节安全的,可能会对多字节字符集产生意外的结果。此外,这些运算符通过字节值比较字符,即使给定的排序规则将重音字符视为相等,重音字符也可能不会进行相等的比较。“我有同样的问题,并且考虑过了。这非常有效。简单、可读且性能好。无需正则表达式。BLA?或BLA!或BLA、BLA BLA或“BLA–”"...
Select * from `users` where username COLLATE latin1_general_cs LIKE '%$email%'
SELECT 
    *
FROM
    `products`
WHERE
    product_name regexp '(^|[[:space:]])BLA([[:space:]]|$)';