专辑表:
+------------------------------+
| id name updated_at|
+------------------------------+
相册成员表:
+------------------------------------+
| id album_id member_id |
+------------------------------------+
相册媒体表:
+--------------------------------+
| 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是相册用户关注的相册。我希望数据能够检索使用follow的所有相册和该相册的所有照片,但限制是需要设置album_mmedia限制5和相册限制30。
limit
不起作用,因为我使用了group_concat,是否有其他方式来限制group_concat的记录?我正在使用laravel,所以任何关于它的解决方案也是最受欢迎的。
我使用了substraing_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模型上创建一个scope方法,而不是做whereHas。这将比上面的例子干净得多。