%LIKE%检索例如。呼叫MEN时的女性数据

时间:2014-12-26 15:30:06

标签: php regex laravel

  $itemList = DB::table('items')
                ->orderBy('id', 'desc')
                ->where('item_status', 2)
                ->where(function($query) use($queryArr)
                {
                    foreach($queryArr as $uID){
                        $query->whereRaw("tags LIKE '%$uID%'");
                    }
                })->paginate(21);

我很长一段时间以来一直面对这个问题。执行LIKE搜索时出现的问题是,当它只是男性

时,它会抓取女性的数据

主要是因为MEN在女性内部

我也尝试过以下操作但失败了(这种方法只有一句话)men没有women数据

$query->where('tags', 'LIKE', '%'.$uID.'%');
SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';

如何在laravel查询构建器

中使用该Word边界查询

试过这个但仍未通过$ query-&gt; whereRaw(&#34;标签LIKE REGEXP&#39; [[:&lt;:]]男[[:&gt;:]]&#39;&#34 );

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'REGEXP '[[:<:]]Men[[:>:]]')' at line 1 (SQL: select count(*) as aggregate from items where item_status = ? and (tags LIKE REGEXP '[[:<:]]Men[[:>:]]')) (Bindings: array ( 0 => 2, ))

我也理解有些人问为什么不只是创造了一种处理这些项目类别的正确方法。好吧,我认为现在使用全文搜索对我来说最好是在缩放时我将使用弹性搜索。真?

更新

不提供标签示例的道歉

包,鞋,的男性下,挖起杆

包,鞋,的男性

男性下,鞋,包

3 个答案:

答案 0 :(得分:2)

如果值以逗号分隔,请尝试使用以下

WHERE `tags` REGEXP "(^|,)men(,|$)"

这需要在单词men周围加上逗号或字符串结尾。

答案 1 :(得分:2)

由于额外的LIKE关键字,您的REGEXP解决方案会抛出语法错误。正确的语法只是WHERE column REGEXP 'pattern'

如果您发现这很难记住,请尝试使用RLIKE,这是MySQL的REGEXP的同义词。 WHERE column LIKE RLIKE ...的可能性较小,因为它显然是多余的。

模式本身应该可以正常工作。就个人而言,我不喜欢在MySQL中使用这些单词边界类;因为您知道您的标记以逗号分隔并填充了空格,所以[ ,]Man[ ,]也可以正常运行。除了下划线之外,单词边界类在标点符号处断开,因此如果您有带连字符的标记,则可能会遇到麻烦。

如果您想使用带空格的多个单词标签,则之前的任何一种模式都是错误的。在这种情况下,我会尝试使用逗号作为分隔符,删除空格填充并使用锚点,如其他答案之一所示:(^|,)Man($|,)

答案 2 :(得分:-1)

在您的查询中,您说:查找包含标记'MEN' => '%MEN%'的任何内容,这就是为什么它显示:女性和男性,所以要回答您的问题,您应该使用开头而不是包含,例如这个:

$query->where('tags', 'LIKE', $uID.'%');