Mysql Query Group Concat 限制单个查询中子表的多条记录

Posted

技术标签:

【中文标题】Mysql Query Group Concat 限制单个查询中子表的多条记录【英文标题】:Mysql Query Group Concat Limit multiple record of child table in single query 【发布时间】:2016-03-09 02:56:05 【问题描述】:

专辑表:

+------------------------------+
| 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 限制 5 和专辑限制 30。

    limit 不起作用,因为我使用 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();

【问题讨论】:

我想知道您是否尝试过eager loading constraint。但是,这种雄辩的方法将具有嵌套结构。 @Tezla 我试过了,但我有动态 id 所以它不工作只是看看它...$data['album'] = 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(); laravel raw 查询超出了我的范围,如果您想检索任何与其相关的专辑(album_media 和album_member)。假设您在模型之间有适当的关系,可以通过Album::where('id', $id)->with(['albumMedia' => function($query)return $query->take(5);, 'albumMember' => function($query) use($member_id)return $query->where('member_id', $member_id')->take(30);])->first(); 完成.. ps。我认为您需要将$member_id 传递给急切的约束。 感谢@Tezla 的回复,但专辑ID 不是静态的album_id 是AlbumMember 返回的那些,所以它以适当的$member_id 存储在album_media 中,我只有member_id 非常感谢您的编译 这可能有助于限制 group_concat 语句***.com/questions/23608464/group-concat-with-limit 【参考方案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 模型添加一个方法,该方法将帮助您根据热切加载的关系检索连接的字符串/链接。

更好的是,除了执行 whereHas 之外,您还可以使用 Album 模型上的范围方法来为您创建它。这会比上面的例子干净得多。

【讨论】:

以上是关于Mysql Query Group Concat 限制单个查询中子表的多条记录的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 查询 IN GROUP_CONCAT 不起作用

在 Codeigniter/MYSQL 中将选定属性添加到 group_concat 输出

如何使用 Google Big Query 在 GROUP_CONCAT 上获取不同的值

Mysql group_concat 的重复键和 1 个查询中多列的重复计数(查询优化)

mysqli_query($link,'SET group_concat_max_len=8192');

Sqlite Query, Group_Concat 的多个左连接和嵌套查询