当前位置: 首页 > 知识库问答 >
问题:

如何将左联接中有联接的sql转换为查询生成器?

井疏珂
2023-03-14
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_d2in_hdoc_code=in_d2doc_codein_hbook=in_d2book

谁能帮我解决我的问题?多谢了。

共有1个答案

张光辉
2023-03-14

您需要一个子查询左联接。->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%正确的,但它应该让你在正确的道路上。

 类似资料:
  • 问题内容: 我有一个在SQL中完美运行的查询,但是我有最糟糕的时间将其转换为linq。该表(下面的表1)保存了多种记录类型的状态更改。联接需要设置两个字段以创建有效联接:SubmissionId(状态所属的表的pk)和SubmissionTypeId(确定状态所属的表)。 我已经尝试过使用x.DefaultIfEmpty()中的y到x进行多次迭代,并且无法在正确的位置设置where子句。我需要从T

  • 任何帮助都将不胜感激!

  • 我在Mysql中有一个查询, 我已经完成了简单的查询转换为hibernate查询。我将所有pojo类绑定到表。请指导我如何将多个连接查询转换为一个hibernate查询。

  • 我有下面的查询,我正试图将其转换为Laravel的查询生成器,以便利用自动转义等功能。 实际上,查询所说的是“获取所有主题的名称,如果它们有匹配的report_comment(通过中间的表),将其与主题一起返回”(对于给定的条件,主题有一个或零report_comments)...如果我直接在MySQL中运行查询并返回我期望的结果,查询就可以工作。目前是硬编码的,但最终将成为占位符,以便可以传入任

  • 我需要从中选择所有行,如果选择位置子句匹配,则从中选择匹配这是我的外部与子查询,但它失败了。有人可以帮忙吗?

  • 问题内容: 我有两个包含“任务”和“注释”的表,并且想要检索一个任务列表,以及每个任务的关联注释数。这两个查询可以完成任务: 它们之间有区别吗?我应该在一个之上使用另一个,还是它们只是完成同一工作的两种方式?谢谢。 问题答案: 在小型数据集上,当涉及到性能时,它们会被淘汰。索引时,LOJ会好一些。 我发现在大型数据集上,内部联接(内部联接也将起作用。)将在很大的因素(抱歉,没有数字)方面优于子查询