【问题标题】:Text match SQL query that finds similar matches based on a subject, but restricts the exact match文本匹配 SQL 查询,根据主题查找相似匹配,但限制完全匹配
【发布时间】:2019-05-13 00:28:18
【问题描述】:

我正在创建一个错误跟踪工具并尝试添加查找类似错误的功能,不包括您正在搜索的错误。我正在使用 Laravel 5.7/eloquent 和 postgreSQL。当前的原始查询如下所示:

SELECT 
    * 
FROM bugs 
WHERE 
    subject::text like 'Delectus iusto est architecto magni expedita eum rerum consequatur.' 
OR 
    description::text like 'Delectus iusto est architecto magni expedita eum rerum consequatur.'
AND 
    id <> 'e0433097-d2b0-49ac-8aea-fcdbefa378b5'

雄辩的版本被提取到一个 BugSearch 类中,但本质上是这样做的:

$builder = DB::table('bugs');
$builder->where('subject', 'like', $bug->subject)
        ->orWhere('description', 'like', $bug->description);

并返回构建器,此时我尝试添加 where 子句:

$matches = $builder->where('id', '!=', $bug->id)->get();
return response()->json($matches);

这显然不适用于原始查询或 eloquent 的查询构建器,因为两者都返回完全匹配,需要通过 where 子句过滤掉。

【问题讨论】:

    标签: sql laravel postgresql eloquent laravel-5.7


    【解决方案1】:

    您没有在查询中明确说明什么是“不起作用”...

    但是,根据您的帖子,您可能只是遇到了运算符优先级 问题。 and 的优先级高于 or,因此您可能希望将 ors 包含在括号中。

    此外,如果您希望使用 LIKE 运算符,则需要用百分号 (%) 将搜索字符串括起来。

    select * from bugs 
    where 
    ( 
        subject::text like '%Delectus iusto est architecto magni expedita eum rerum consequatur.%' 
        or description::text like '%Delectus iusto est architecto magni expedita eum rerum consequatur.%' 
    )
    and id <> 'e0433097-d2b0-49ac-8aea-fcdbefa378b5' 
    

    没有括号,查询实际上等价于:

    select * from bugs 
    where 
    subject::text like 'Delectus iusto est architecto magni expedita eum rerum consequatur.' 
    or 
    ( 
        or description::text like 'Delectus iusto est architecto magni expedita eum rerum consequatur.' 
        and id <> 'e0433097-d2b0-49ac-8aea-fcdbefa378b5' 
    )
    order by created_at desc
    

    【讨论】:

    • 啊,是的。你知道如何使用 Laravel 的查询构建器来复制它吗?
    • 好的,所以相应地更新了我的答案。但是,我对 Lavarel 不是很熟悉,因此无法为您提供确切的语法(需要查看文档)
    • 欢迎@MattLarson !
    【解决方案2】:

    我实际上通过在 BugSearch 类的构造函数中传递 -&gt;where('id', '!=', $bug-&gt;id); 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2021-04-06
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多