Laravel Eloquent 在子查询中有两个“WHERE NOT IN”

Posted

技术标签:

【中文标题】Laravel Eloquent 在子查询中有两个“WHERE NOT IN”【英文标题】:Laravel Eloquent with two “WHERE NOT IN” in subquery 【发布时间】:2017-11-28 07:28:51 【问题描述】:

我有这个查询,我无法在 laravel eloquent ORM 中编写查询。

感谢有人可以提供帮助。

这是 SQL 表达式:

SELECT DISTINCT cust, cust_no FROM delivery_sap 
WHERE cust NOT IN ( SELECT cust_name FROM customer) 
AND cust_no NOT IN ( SELECT cust_code FROM customer)

【问题讨论】:

我已更新尝试新答案 见meta.***.com/questions/333952/… 在***.com/a/46275818/2803948找到一个好的答案 【参考方案1】:

您可以使用如下所示的方式来代替执行 3 个不同的查询,

DB::table('delivery_sap')
->whereNotIn('cust', function ($query) 
        $query->select('cust_name')->from('customer');
    )
->whereNotIn('cust_no', function ($query) 
        $query->select('cust_code')->from('customer');
    )
->select('cust', 'cust_no')
->distinct('cust')
->get();

此代码将给出与问题中提出的完全相同的查询, 要检查查询,请使用以下代码

DB::table('delivery_sap')
->whereNotIn('cust', function ($query) 
        $query->select('cust_name')->from('customer');
    )
->whereNotIn('cust_no', function ($query) 
        $query->select('cust_code')->from('customer');
    )
->select('cust', 'cust_no')
->distinct('cust')
->toSql();

输出将是,

select distinct `cust`, `cust_no` from `delivery_sap` 
where `cust` not in (select `cust_name` from `customer`) 
and `cust_no` not in (select `cust_code` from `customer`)

【讨论】:

【参考方案2】:

您可以使用existsleft 连接以获得更好的性能,而不是像现有解决方案那样在同一张表上进行子查询,不需要这两个额外的子查询

SELECT DISTINCT cust, cust_no 
FROM delivery_sap d
WHERE EXISTS (
    SELECT 1
    FROM delivery_sap
    WHERE cust_name = d.cust OR cust_code = d.cust
)

SELECT DISTINCT d.cust, d.cust_no 
FROM delivery_sap d
LEFT JOIN delivery_sap d1 ON d.cust = d1.cust_name OR d.cust = d1.cust_code 
WHERE d1.cust IS NULL

DB::table('delivery_sap as d')
    ->leftJoin('delivery_sap as d1', function ($join) 
        $join->on('d.cust','=','d1.cust_name')
             ->orWhere('d.cust', '=', 'd1.cust_code');
   )
    ->whereNull('d1.cust')
    ->select('cust', 'cust_no')
    ->distinct()
    ->get();

【讨论】:

【参考方案3】:

我将 pluck('cust') 下面的代码更正为 pluck('cust_name') 和 pluck('cust_no') 到 pluck('cust_code') 就可以了

DB::table('delivery_sap')
    ->whereNotIn('cust', DB::table('customer')->pluck('cust_name'))
    ->whereNotIn('cust_no', DB::table('customer')->pluck('cust_code'))
    ->select('cust', 'cust_no')
    ->groupBy('cust', 'cust_no')
    ->get();

【讨论】:

【参考方案4】:

试试这样的:

DB::table('delivery_sap')
    ->whereNotIn('cust', DB::table('customer')->pluck('cust'))
    ->whereNotIn('cust_no', DB::table('customer')->pluck('cust_no'))
    ->select('cust', 'cust_no')
    ->groupBy('cust', 'cust_no')
    ->get();

【讨论】:

不工作。我试图弄清楚为什么。关于在 phpmyadmin 中有效,但我说“'字段列表'中的未知列 'cust'” 您在客户表中有不同的列名。如果您的问题已经解决,请关闭问题 这获得了所需的数据,但并不是问题所要求的。它执行 3 个单独的查询。请参阅下面 Akshay Kulkarni 的回答,了解如何使用高级 wheres 在单个查询中完成此操作

以上是关于Laravel Eloquent 在子查询中有两个“WHERE NOT IN”的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5 / Eloquent - 对属于多的关系进行查询过滤

在 Laravel Eloquent 中,你如何在联合范围之外进行两个联合查询和一个选择?

讨论:Laravel Eloquent vs DB 查询追加

两个外键,如何用 laravel eloquent 映射

Laravel Eloquent ORM - 选择所有两个关系都不存在的模型时,生成的 SQL 和查询构建器结果不匹配

laravel Eloquent 查询 WhereHas 结果错误