Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.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
PHP/MySQL-包括复数,但不包括单数_Php_Mysql - Fatal编程技术网

PHP/MySQL-包括复数,但不包括单数

PHP/MySQL-包括复数,但不包括单数,php,mysql,Php,Mysql,我正在建立一个网站,要求包括复数词,但不包括单数词,以及包括较长的短语,但不包括其中发现的较短短语 例如: 搜索Breads应该返回包含“Breads”的结果,而不是“bread”或“read” 搜索平装书时应返回包含“平装书”的结果,但不能返回“平装书”或“书” 我尝试过的查询是: SELECT * FROM table WHERE (field LIKE '%breads%') AND (field NOT LIKE '%bread%') …虽然有“面包”和“面包”的记录,但显然没有返回任

我正在建立一个网站,要求包括复数词,但不包括单数词,以及包括较长的短语,但不包括其中发现的较短短语

例如:

搜索Breads应该返回包含“Breads”的结果,而不是“bread”或“read”

搜索平装书时应返回包含“平装书”的结果,但不能返回“平装书”或“书”

我尝试过的查询是:

SELECT * FROM table WHERE (field LIKE '%breads%') AND (field NOT LIKE '%bread%')
…虽然有“面包”和“面包”的记录,但显然没有返回任何结果

我理解为什么这个查询失败,我告诉它既包含和排除相同的字符串,但我不能想到应用于代码的正确逻辑来使它工作。

您应该考虑使用.< /p> 这将解决您的面包/阅读问题


我相信在这里使用通配符是没有用的。假设您使用的是“%read%”,现在还将返回bread、breads等,这就是我建议进行全文搜索的原因,

搜索%breads%将永远不会返回bread或read,因为“s”是匹配所需的字符。因此,只需删除and子句:

SELECT ... WHERE (field LIKE '%breads%')
SELECT ... WHERE (field LIKE '%paperback book%');

使用MySQL,您可以使用REGEXP而不是like,这样可以更好地控制查询

SELECT * FROM table WHERE field REGEXP '\s+read\s+'

这至少会在查询周围加强单词边界,并使您能够更好地控制匹配,但会降低性能。

但这确实会阻止您使用InnoDB表。英语是一种不规则的语言。您将很难获得一个可靠的复数定义,您可以使用简单的SQL查询它。此外,使用通配符搜索的方式非常慢。对于任何大小合理的数据库,您都必须找到替代解决方案。数据库中的数据不够规范化。您需要将每个文本拆分为单词,并标记每个单词是否为单数。然后,您可以在文本中只搜索单数词。%n是一个与任何内容都匹配的野生字符,所以在这种情况下使用时要小心。。。。顶部有一条注释说这是重写-不知道是否可以合并?@CD001:编辑原始问题以添加新信息。我认为在这里使用通配符没有用。假设您使用的是“%read%”,现在还将返回bread、breads等,这就是我建议使用全文搜索true的原因,但是在搜索较小的单词时,可以使用和,而不是额外的位。对于不能以缩略形式出现的较长单词,此简化where子句适用。