只做左撇子时的第一行

时间:2015-07-08 07:59:59

标签: php mysql laravel laravel-4

是否可以在执行leftjoin时限制结果?

(Laravel 4.2) - Querybuilder

我用laravel的querybuilder获得了以下查询:

    DB::table('part')
      ->leftjoin('model', 'model.model_id', '=', 'part.model_id')
      ->leftjoin('make',  'model.make_id',  '=', 'make.make_id')
      ->leftJoin('photo', 'photo.part_id',  '=', 'part.part_id')
      ->select( 'part.part_id',
                'part.model_id',
                'make.desc   as make_desc',
                'model.desc  as model_desc',
                'photo.local as local_img',
                'photo.cdn   as cdn_img')
      ->take(8)->get();

每个部分都有超过4张照片,但我只希望第一张照片包含在连接中。问题是,当我使用此查询时,我得到8个部分对象(结果)。但是8个结果不是8个部分,而是2个部分。此查询创建4个相同的零件对象,唯一的区别是照片(连接包括每张照片)。

我尝试过这样的事情:

 ->select( '(photo.local LIMIT 1) as local_img',
           '(photo.cdn LIMIT 1) as cdn_img')

但这不起作用。我也尝试过做原始查询。我还尝试在leftjoin闭包中使用' - > take(1)',如下所示:

->leftjoin('photo', function($q){
    $q->on('photo', 'photo.part_id',  '=', 'part.part_id')->take(1);
});

但这是不可能的。

我正在搜索只包含左连接中第一个照片行的解决方案。

编辑:跟进mgrueter的回答。我知道groupby可以做到这一点,但这会使查询变得非常慢。所以我想以不同的方式做到这一点,因此查询不会变慢。

1 个答案:

答案 0 :(得分:0)

按'part.id'对结果进行分组:

DB::table('part')
  ->leftjoin('model', 'model.model_id', '=', 'part.model_id')
  ->leftjoin('make',  'model.make_id',  '=', 'make.make_id')
  ->leftJoin('photo', 'photo.part_id',  '=', 'part.part_id')
  ->select( 'part.part_id',
            'part.model_id',
            'make.desc   as make_desc',
            'model.desc  as model_desc',
            'photo.local as local_img',
            'photo.cdn   as cdn_img')
  ->group_by('part.part_id')
  ->take(8)->get();

还可以通过'photo.created'或您要确定的任何列来排序结果,这是第一张照片。