select v_dts.* from v_dts
left join(select in_d2.ref_book from in_h
inner join in_d2 on(in_h.doc_code=in_d2.doc_code and in_h.book=in_d2.book)
where in_h.doc_code='IN' group by in_d2.ref_book) as i
on(v_dts.book=i.ref_book)
$order_progress = DB::table('v_dts')
->select('v_dts.*')
->leftJoin('in_h',function($join_in_h){
$join_in_h->select('in_d2.ref_book');
$join_in_h->join('in_d2',function($join_in_d2){
$join_in_d2->on('in_h.doc_code','=','in_d2.doc_code');
$join_in_d2->on('in_h.book','=','in_d2.book');
$join_in_d2->where('in_h.doc_code','=','IN');
$join_in_d2->groupBy('in_d2.ref_book');
});
})
->get();
但是,我的查询生成器是错误的。它会显示错误消息
SQLState[42000]:语法错误或访问冲突:1064您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册以获得正确的语法
和生成的SQL
SQL:从v_dts
左联接中选择v_dts
.*(in_h
内联接in_d2
对in_h
。doc_code
=in_d2
。doc_code
和in_h
。book
=in_d2
。book
和
谁能帮我解决我的问题?多谢了。
您需要一个子查询左联接。->leftjoin('in_h',function($join_in_h){...}
不执行子查询联接;这是一个常规的带有特殊联接子句的左联接。
而是使用->leftjoinsub
。
可以使用joinSub、leftJoinSub和rightJoinSub方法将查询连接到子查询。这些方法中的每一个都接收三个参数:子查询、其表别名和定义相关列的闭包。
编写子查询。
$ref_books = DB::table('in_h')
->select('in_d2.ref_book')
->join('in_d2', function($join){
$join->on('in_h.doc_code','=','in_d2.doc_code')
->where('in_h.book','=','in_d2.book');
})
->where('in_h.doc_code','=','IN')
->groupBy('in_d2.ref_book');
并在另一个查询中使用它。
$order_progress = DB::table('v_dts')
->select('v_dts.*')
->leftJoinSub($ref_books, 'i',function($join){
$join->on('v_dts.book', '=', 'i.ref_book');
})
->get();
可以使用->dd()
和->dump()
转储生成的SQL进行调试。
请参阅Laravel文档中的“子查询联接”。
注意:我没有Laravel所以我不能检查这是100%正确的,但它应该让你在正确的道路上。