Подтвердить что ты не робот

Mysql Query Group Concat Ограничить несколько записей дочерней таблицы в одном запросе

Таблица альбомов:

+------------------------------+
| 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 limit 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();
4b9b3361

Ответ 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();

Наконец, вы могли бы добавить метод к модели альбома, который поможет вам получить вашу конкатенированную строку/ссылку, основанную на нетерпимо-загруженном соотношении.

Еще лучше, вместо того, чтобы делать whereHas, вы могли бы что-то вроде метода scope в модели альбома, который создаст его для вас. Это было бы намного чище, чем приведенный выше пример.