%LIKE% 检索例如。打电话给男性时的女性数据

Posted

技术标签:

【中文标题】%LIKE% 检索例如。打电话给男性时的女性数据【英文标题】:%LIKE% retrieves eg. WOMEN DATA when calling MEN 【发布时间】:2015-02-23 20:55:56 【问题描述】:
  $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

时,它会抓取 WOMEN 的数据

主要是因为男人在女人里面

我也尝试了以下但失败(这种抢词)men没有women数据

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

如何在 laravel 查询生成器中使用该词边界查询

试过这个还是失败 $query->whereRaw("tags LIKE REGEXP '[[:<:>:]]'");

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, ))

我也理解有人问为什么不创建一个正确的方法来处理这些项目的类别。好吧,我认为现在使用全文搜索对我来说最多就可以了,当涉及到缩放时,我将使用弹性搜索。真的吗?

更新

抱歉没有给出标签示例

包、鞋、男士、坡跟

包、鞋、男士

男士,鞋,包

【问题讨论】:

你能给我们看一个tags的值的例子吗? 因为当你使用 %men% 时,意味着 women 会返回 true。 nomen 也会返回 true.. 任何以 men 结尾的东西都会返回 true.. tags 字段中有空格分隔的标签列表吗? @AlexeyMatskoff 逗号,刚刚更新。 @lukasgeiter 刚刚更新。 【参考方案1】:

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

如果您觉得这很难记住,请尝试使用 RLIKE,它是 MySQL 的 REGEXP 的同义词。在查询中意外写入 WHERE column LIKE RLIKE ... 的可能性较小,因为它显然是多余的。

模式本身应该可以正常工作。就个人而言,我不喜欢在 MySQL 中使用那些单词边界类。因为你知道你的标签是逗号分隔和空格填充的,[ ,]Man[ ,] 也可以正常工作。单词边界类在标点符号处中断而不是下划线,因此如果您有连字符的标签,例如,您可能会遇到麻烦。

如果你想使用多个带有空格的单词标签,前面的任何一个模式都是错误的。在这种情况下,我会尝试坚持使用逗号作为分隔符,去掉空格填充并改用锚点,正如其他答案之一中所建议的那样:(^|,)Man($|,)

【讨论】:

【参考方案2】:

在您的查询中,您说:查找包含标签 'MEN' =&gt; '%MEN%' 的任何内容,这就是它显示的原因:WOMEN AND MEN,因此要回答您的问题,您应该使用开头而不是包含,如下所示:

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

【讨论】:

抱歉没有给出标签的例子 Women,Shoes,Men,Wedge(没有意义)但是是的 看到它不会抓住,因为在男人这个词之前,它没有通配符。但在它之前,它是一个逗号 ->where(function($query) use($queryArr) foreach($queryArr as $uID) $query->orWhere('tags', 'LIKE', $uID .' %'); 大声笑你根本不明白,为什么不明白就回答?你说 %fake% 到底是什么鬼,如果是 %men%,它会调用女性数据,这正是他试图解决的问题。大声笑你把他的问题作为解决方案吗?什么?【参考方案3】:

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

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

这将需要在 men 周围使用逗号或字符串结尾。

【讨论】:

对于第一个和最后一个标签,它会在前面和最后一个标签处留有空格,在末尾留空格。还能用吗? 我有以下值:“男人”,“女人”,“女人,男人”,“男人,女人”,“狗,男人,鸟”。我运行了以下查询:SELECT * FROM test WHERE tags REGEXP "(^|,)men(,|$)" 它返回了除“women”之外的所有记录。应该如此。在 MySQL 上进行了检查。你可以举出更多的例子,我可以检查他们的查询。 男士、鞋子、包包怎么样 @FlyingAtom,被选中 @AlexeyMatskoff 但你说“这需要在 men 周围使用逗号或字符串结尾。”

以上是关于%LIKE% 检索例如。打电话给男性时的女性数据的主要内容,如果未能解决你的问题,请参考以下文章

正态分布预测女性高于男性!

将列值从“男性”替换为“女性”,将“女性”替换为“男性”

循环记录并根据条件更新数据库

报手机号码时,男性一般是344格式,女性一般是443格式。这是啥意思呀

如何获得所有女性?

如果条件唯一,则 MySQL 不同计数