【问题标题】:Only get the first row while doing a leftjoin仅在进行 leftjoin 时获取第一行
【发布时间】:2015-09-26 00:21:54
【问题描述】:

是否可以在进行左连接时限制结果?

(Laravel 4.2) - 查询构建器

我使用 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);
});

但这是不可能的。

我正在寻找一种解决方案,只在 leftjoin 中包含第一张照片行。

编辑:跟进 mgrueter 的回答。我知道 groupby 可以解决问题,但这会使查询非常慢。所以我想以不同的方式来做,这样查询就不会变慢。

【问题讨论】:

  • 我相信您正在寻找的是 groupby。我会尝试在 part.part_id 上使用 group by

标签: php mysql laravel laravel-4


【解决方案1】:

按“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”或您必须确定的任何列(即第一张照片)对结果进行排序。

【讨论】:

  • 是的,这确实是我现在正在做的事情。但我真的不想这样做,因为它使查询非常慢。 (groupby有很多部分)
  • 我很确定这是唯一的解决方案,除了进行 2 次查询(1 次获取所有模型、零件和制造商,1 次获取先前找到的 part_ids 的照片)——这可能是如果您担心 group_by 很慢,这是更好的解决方案。
  • 或者您可以使用“解释”来确定更好/不同的索引是否可以帮助您提高 group_by 的性能
  • 你试过在 Laravel 中使用 Eloquent。关系(在 Eloquent 中)似乎是解决问题的好方法。
  • 感谢您的意见。不幸的是,数据库很旧,并且在很多项目中都使用过。所以索引有它的风险,我不愿意承担。我现在正在创建 2 个查询,就像你建议的那样,1 个用于零件,1 个用于照片,所以我可以检查速度差异。
猜你喜欢
  • 2021-02-14
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 2011-08-13
  • 1970-01-01
  • 2018-07-26
相关资源
最近更新 更多