Mysql查询组Concat在单个查询中限制子表的多个记录

时间:2015-12-04 08:28:33

标签: php mysql laravel eloquent laravel-5.1

相册表

+------------------------------+
| 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。

  1. limit无效,因为我使用group_concat以其他方式限制group_concat的记录?

  2. 我正在使用laravel,所以对此也有任何解决方案。

  3. 我使用了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();
    

1 个答案:

答案 0 :(得分:1)

建立你的关系,然后像这样约束它们:

$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模型上使用范围方法,而不是在whereHas中创建它。这比上面的例子要清晰得多。