【问题标题】:How to join tables with more than one attribute match?如何连接具有多个属性匹配的表?
【发布时间】:2019-12-10 22:22:53
【问题描述】:

我正在尝试将我的原始 sql 转换为 laravel 查询构建器,但在如何使用多个属性匹配连接多个表时遇到了困难。

在这种情况下,我想用三个属性匹配(book、p_seq 和 staff_code)而不是一个(book)来连接表 jr_h 和 jr_d。 原始 sql:

 $sql =  "select from_time,to_time,t.staff_code,s.name_t as staff_name,t.book,t.p_code,t.p_seq,p.hrs1,s.img_file, 
        t.hrs_work,p.sharing_cnt  as hrs_work, t.hrs_ot  as hrs_ot from jr_d as t 
        inner join jr_h as p on(t.book=p.book and t.p_seq=p.p_seq and t.staff_code=p.staff_code)  
        inner join astaff as s on(t.staff_code=s.staff_code) ";

Laravel 查询构建器:

   $jr_d = DB::table('jr_d')
        ->join('jr_h', 'jr_d.book', '=', 'jr_h.book')
        ->join('astaff', 'jr_d.staff_code', '=', 'astaff.staff_code')
        ->select('jr_h.*','jr_d.*','astaff.*','astaff.name_t as staff_name')
        ->where('jr_d.ref_group','=','E')
        ->get();

并且还想知道是否有一种方法可以使查询更快,因为它在表中有很多数据。

【问题讨论】:

    标签: php mysql laravel laravel-query-builder


    【解决方案1】:

    试试这个。

    $jr_d = DB::table('jr_d')
            ->join('jr_h', 'jr_d.book', '=', 'jr_h.book')
            ->join('astaff', 'jr_d.staff_code', '=', 'astaff.staff_code')
            ->select('*','astaff.name_t as staff_name')
            ->where('jr_d.ref_group','=','E')
            ->get();
    

    【讨论】:

      【解决方案2】:

      Laravel 加入多个条件:

      $results = DB::table('jr_d')
                  ->select('jr_h.*','jr_d.*','astaff.*','astaff.name_t as staff_name')
                  ->join('jr_h', 'jr_d.book', '=', 'jr_h.book')
                  ->join('jr_h as p', function($query){
                      $query->on('t.book','=', p.book');
                      $query->on('t.p_seq','=', 'p.p_seq');
                      $query->on('t.staff_code', '=', 'p.staff_code');
                  })
                  ->where('jr_d.ref_group','=','E')
                  ->get();
          `
      

      【讨论】:

      • 是的,它有效,如何让它更快?我正在等待 3 分钟让它工作......
      • @QiYang 那么请接受答案,一般来说,查询几乎是原始的 sql 语句,你真的没有太多选择来让它更快,因为多个条件的多个连接会减慢它的速度。加快速度的建议是为要加入的表添加索引。
      【解决方案3】:

      试试这个:

      // ...
      ->join('jr_h p', function($join) {
         $join->on('t.book', '=', 'p.book');
         $join->on('t.p_seq', '=', 'p.p_seq');
      // ... more conditions
      });
      

      【讨论】:

      • 是的,它有效,如何让它更快?我正在等待 3 分钟让它工作......
      • 嗯,性能可能与用 Laravel DB builder 编写的查询无关。如果还没有,您可能需要在不同的列上定义索引。
      • 我根据日期查询了很多,这意味着我应该为大多数表在日期列上定义索引?
      • 在日期列上定义索引可以提高其性能
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多