相册表:
+------------------------------+ | id name updated_at| +------------------------------+
Album_member表:
+------------------------------------+ | id album_id member_id | +------------------------------------+
Album_media表:
+--------------------------------+ | id album_id link | +--------------------------------+
我的查询:
$limit = 30; $member_id = 1; SELECT a . *,(SELECT GROUP_CONCAT(CONCAT('$assets/album_image/medium/',ds_album_media.link) SEPARATOR ',') as link FROM ds_album_media WHERE ds_album_media.album_id = a.id ORDER BY a.updated_at desc LIMIT 0,5) AS photo_link FROM `ds_album` a LEFT JOIN ds_album_media amd ON amd.album_id = a.id LEFT JOIN ds_album_member amb ON amb.album_id = a.id where amb.member_id = " . $member_id . " GROUP BY a.id ORDER BY a.updated_at desc LIMIT 0,$limit
现在,对于每张专辑,有多个album_media和album_member是专辑用户正在关注的,我想要的数据以这种方式检索所有使用以下的相册,并且该相册的所有照片,但约束是需要设置album_media限制5和专辑限制30.
>限制不工作,因为我使用group_concat任何其他方式来限制group_concat的记录?
>我正在使用laravel,所以任何解决方案也是最受欢迎的.
我使用substring_index()函数,但是在性能方面是否足够了?
我试过这个查询与laravel,
Laravel查询(编辑):
$data = Album::select("album.*") ->leftjoin("album_media",'album_media.album_id','=','album.id') ->leftjoin("album_member",'album_member.album_id','album.id') ->where('album_member.member_id',$member_id) ->with(['albumMedia' => function($query) { return $query->where('album_id','album.id')->take(5); }]) ->groupBy('album.id')->orderBy('album.updated_at','desc')->take($limit)->skip($skip)->get()->toArray();
建立你的关系,然后限制他们:
$albums = Album::with('albumMedia','albumMembers') ->whereHas('albumMembers',function($query) use ($userId) { $query->where('albumMembers.member_id',$userId); }) ->orderBy('album.updated_at') ->take($limit) ->skip($skip) ->get();
最后,您可以添加一个方法到Album模型,这将帮助您检索连接的字符串/链接,基于热切的关系.
更好的是,而不是做一个地方,你可以像Album模型上的范围方法一样,这将为您创建它.这将比上面的例子更干净.