Laravel 查询生成器从子查询中选择

问题描述

我正在尝试将 sql 查询转换为 Laravel 查询构建器, 但我很难理解哪种是 Laravel 中 FORM SUBQUERY 的最佳方式, 因为如果我没记错的话,这不是您通常可以使用查询生成器执行的操作,但您应该以原始方式实现。

这样对吗?

应该如何翻译?

 SELECT t1.* FROM (//with out sub query it would be just products AS t1
                   SELECT SUM(amount)AS amount,products.* 
                   FROM products,orders 
                   WHERE orders.product_id = products.product_id 
                   GROUP BY orders.product_id )AS t1
 LEFT OUTER JOIN products as t2 
 ON(t1.name = t2.name AND t1.year_production< t2.year_production) 
 WHERE t2.name is null 

无需添加查询即可翻译

 $poductlist =Product::from('products AS t1')->select('t1.*')
                     ->leftjoin('products AS t2',function($join){
                               $join->on('t1.name','=','t2.name')
                                    ->on('t1.year_production','<','t2.year_production')
                                    ->whereNull('t2.name')
                                    ->orderBy('t2.name','desc');})
                     ->get();

解决方法

我相信您可以将您的查询重写为相关子查询,以过滤具有最大值为 year_production 且名称重复的产品

select p.product_id,p.name,coalesce(sum(o.amount),0) as amount
from products as p
left join orders o on p.product_id = o.product_id
where exists (
    select 1
    from products p1
    where p1.name = p.name
    having max(p1.year_production) = p.year_production
)
group by p.product_id,p.name
order by p.product_id

并且在查询构建器中您可以将其转换为

$products = DB::table('products as p')
               ->select(['p.product_id','p.name',DB::raw('coalesce(sum(o.amount),0) as amount')
                        ])
               ->leftJoin('orders as o','p.product_id','=','o.product_id' )
               ->whereExists(function ($query) {
                   $query->select(DB::raw(1))
                         ->from('products as p1')
                         ->whereRaw(DB::raw('p1.name = p.name'))
                         ->havingRaw('max(p1.year_production) = p.year_production')
                         ;
              })
              ->groupBy('p.product_id','p.name')
              ->orderBy('p.product_id')
              ->get();

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...