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