我试图使用PHP在mysql数据库中的字符串中搜索单词。
我遇到的问题是它在我的PHP页面上搜索并吐出结果,但是任何与搜索到的单词相近的单词也会在我的页面上得到结果。
更好地解释这个,让我说我有一个像这样的字符串:
women's clothing
现在,如果我搜索的单词women
正在我的页面上正确显示结果但是如果我搜索单词men
,我的页面上会显示相同的结果因为女性这个词里面有男人这个词。
这是我当前的SQL查询:
SELECT id, category_name, image_url FROM data WHERE `category_name` LIKE '%$sub%' GROUP BY category_name
我尝试将'%$sub%'
更改为'$sub'
,但这根本不会返回任何结果!
有人可以就此提出建议吗?
编辑:
category_name列中的字符串各不相同,因为它们来自外部API,所以无法更改。
这些字符串可能会有所不同。所以有人看起来像女装连衣裙&裙子和另一件可能看起来像女式鞋子,另一件可能看起来像女式皮包,而另一件可能看起来像男式鞋子等....
所以我需要做的是显示关键字女性的所有结果并显示所有男性的结果。我希望这是有道理的。
但此刻,男性和女性的结果同时显示,因为正如我在上面解释的那样,女性这个词中有男人这个词。
答案 0 :(得分:3)
你可以使用MySQL的REGEXP
运算符,使用单词匹配。
SELECT ... WHERE column REGEXP '[[:<:]]$sub[[:>:]]' ...
答案 1 :(得分:1)
你想要的东西,就是你想要男装出现,但没有像女人那样的东西。这两个结果之间的唯一区别是,女性面前有男性角色,而男装的服装则有角色。
Mrun他的想法是,如果你想搜索确切的单词后面没有任何内容。因此,当您使用:if/try-catch/foreach
时,只有结果显示单词MEN后面没有任何内容,而且直接单词MEN前面没有任何内容。中间必须有一个空间。
现在,为了让您的结果有效,您可以使用:LIKE '% $sub %'
(最后没有空格),但这确实意味着单词MEN可以跟随anthing。例如,MENACE这个词会出现。如果您希望仅允许使用@mrun建议的特定字符,则可以在LIKE $sub%
和$sub
符号之间添加任何内容。 你必须逃避它。
修改强>
现在我想到了,你可能也希望允许MENS,但这意味着你必须选择自己的条件,因为MYSQL无法自动检测允许复数形式的单词等。
答案 2 :(得分:1)
有几种选择。这是其中之一:
SELECT id, category_name, image_url FROM data WHERE `category_name` LIKE '% $sub %' OR `category_name` LIKE '% $sub' OR `category_name` LIKE '$sub' OR `category_name` LIKE '$sub %' OR `category_name` LIKE '% $sub\' %' OR `category_name` LIKE '% $sub' OR `category_name` LIKE '$sub\'' OR `category_name` LIKE '$sub\' %' GROUP BY category_name
另一种方法是使用MATCH AGAINST,但你需要使用FULLTEXT索引,方法如下:
SELECT id, category_name, image_url FROM data WHERE MATCH (`category_name`) AGAINST ('+$sub' IN BOOLEAN MODE) GROUP BY category_name
答案 3 :(得分:1)
好的伙计们,感谢您的所有投入。这就是我这样做以及现在的工作方式:
SELECT id, category_name, aw_image_url FROM data WHERE category_name RLIKE '[[:<:]]".$sub."[[:>:]]' GROUP BY category_name