如何连接两个表并选择不匹配的列

Posted

技术标签:

【中文标题】如何连接两个表并选择不匹配的列【英文标题】:How to join two tables and select non matching columns 【发布时间】:2021-07-29 15:23:43 【问题描述】:

我正在尝试编写一个 laravel SQL 查询来连接两个表并从表中提取不匹配的列。

产品表

id Name
1 abe
2 edfg
3 swfgd
4 df
5 fg

清理表

Product_id Name
2 edfg
4 df
5 fg

现在,我希望结果表如下。

结果表

id Name
1 abe
3 swfgd

谁能帮我解决这个问题?

【问题讨论】:

向我们展示一些语法,以便我们做出适当的回复。 SQL端很简单 $pro1 = DB::table('products') ->whereNotIn('id', function($query) DB::table('products') ->join('clearing_quantity_products' , 'clearing_quantity_products.product_id', '=', 'products.id') ->select('products.id'); ) ->get(); 【参考方案1】:

我建议你为每个表创建模型。

对于 Products 表使用命令创建模型

php artisan make:model Product

此命令将在app/Models 中创建文件并添加关系hasMany

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Product extends Model

    use HasFactory;

    protected $table="Products";

    public function clearing()

        return $this->hasMany(Clearing::class,'Product_id','id');
    

同样的方式为 Clearing 表创建模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Clearing extends Model

    use HasFactory;

    protected $table="Clearing";

在你的控制器中

$products=Product::whereDoesntHave('clearing')->get()

【讨论】:

你能告诉我,哪里错了吗? @KiritPendyala 不是工作方式吗?究竟是什么错误【参考方案2】:

我们可以在这里尝试使用左反连接方法:

$users = DB::table('Products p')
    ->select("p.id", "p.Name")
    ->leftJoin('Clearings c', function($join) 
        $join->on('p.id', '=', 'c.Product_id');
        $join->on('p.Name', '=', 'c.Name');
    )
    ->whereNull('c.Product_id');
    ->get();

这将对应于以下 SQL 查询:

SELECT p.*
FROM Products p
LEFT JOIN Clearing c
    ON p.id = c.Product_id AND p.Name = c.Name
WHERE
    c.Product_id IS NULL;

【讨论】:

嘿,它正在工作,但是当我调试时,发现 product.id 对于每条记录都返回为 null。我该如何解决? @KiritPendyala 给select()打个电话会很有帮助,我错过了,这可能导致了您现在看到的问题。 我明白了。如何从产品中检索所有属性,而不是单独按名称访问。你能帮我解决这个问题吗?【参考方案3】:

你可以使用not exists:

select p.*
from products p
where not exists (select 1 from clearing c where c.product_id = p.id);

【讨论】:

你能帮我写一下 laravel PHP Query

以上是关于如何连接两个表并选择不匹配的列的主要内容,如果未能解决你的问题,请参考以下文章

LINQ:如何使用动态键连接两个数据表

连接两个表并从一列返回多个匹配项的 SQL 查询?

从两个表中选择不匹配的列值

如何连接两个 XML 表并嵌套而不重复

连接两个表并从第一个表中选择一个相关值

如何在 PL/SQL 中连接两个表而不创建新表