【发布时间】:2015-03-28 06:22:19
【问题描述】:
这是我的 SQL 查询
select sum(stock.total_in_stock) as total_in_stock,stock.name,stock.inventory_id FROM ( SELECT i.store_id,i.model_id,i. total_in_stock,i.id as inventory_id, m.* from `inventory` as `i` left join `model_store` as `ms` on `ms`.`store_id` = `i`.`store_id` left join `model` as `m` on `m`.`id` = `ms`.`model_id` where `i`.`model_id` = m.id and `m`.`status` = 1 and `ms`.`status` = 1 and `i`.`created_at` = (select max(si.created_at) from `inventory` as `si` where si.model_id = i.model_id AND si.store_id = i.store_id AND si.status=1 ORDER BY si.created_at DESC LIMIT 1 )) as stock group by `stock`.`model_id`
基本上,我正在尝试检索特定商店在最近日期的库存。
我在 laravel 中写了这个查询如下:-
$results = DB::table('inventory as i')
->selectRaw( 'sum(stock.total_in_stock) as total_in_stock,stock.name,stock.inventory_id FROM ( SELECT i.store_id,i.model_id,i. total_in_stock,i.id as inventory_id, m.* ')
->leftJoin('model_store as ms','ms.store_id','=','i.store_id')
->leftJoin('model as m','m.id','=','ms.model_id')
->where('i.model_id','=', 'm.id')
->where('m.status','=', 1)
->where('ms.status','=', 1)
->where('i.created_at','=',function($query){
$query->from('inventory as si')
->selectRaw('max(si.created_at)')
->whereRaw('si.model_id = i.model_id AND si.store_id = i.store_id AND si.status=1 ORDER BY si.created_at DESC LIMIT 1 )) as stock ')
->groupBy('stock.model_id');
})->get();
这给了我以下错误:-
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
(SQL: select sum(stock.total_in_stock) as total_in_stock,stock.name,stock.inventory_id FROM ( SELECT i.store_id,i.model_id,i. total_in_stock,i.id as inventory_id, m.* from `inventory` as `i` left join `model_store` as `ms` on `ms`.`store_id` = `i`.`store_id` left join `model` as `m` on `m`.`id` = `ms`.`model_id` where `i`.`model_id` = m.id and `m`.`status` = 1 and `ms`.`status` = 1 and `i`.`created_at` = (select max(si.created_at) from `inventory` as `si` where si.model_id = i.model_id AND si.store_id = i.store_id AND si.status=1 ORDER BY si.created_at DESC LIMIT 1 )) as stock group by `stock`.`model_id`))
我需要应用分页。所以我必须像上面那样写这个查询。
我尝试使用DB::select() 编写查询。它返回正确的记录,但不幸的是,我不能使用分页。
请帮助我在 laravel 中编写正确的查询。
【问题讨论】:
-
FROM ( SELECT i.store_id...部分是否缺少结束)? -
不,括号已关闭 [->whereRaw('si.model_id = i.model_id AND si.store_id = i.store_id AND si.status=1 ORDER BY si.created_at DESC LIMIT 1 ) ) as stock ') ] 在 LIMIT 1 之后的这一部分
-
查询是正确的,但我不明白它如何在末尾使用 2 个右括号。这就是我得到的错误
-
有时使用纯 sql 更容易.. 有一个静态方法 DB::statement()
-
我尝试过使用 DB::select 语句,效果很好。但是那么如何使用分页呢?我不能将 paginate() 方法与 DB::select 方法一起使用。
标签: php mysql sql laravel query-builder