@Holyboom
junior fullstack

Как в Sql получить связь один ко многим, где многие будут сразу массивом?

Всем доброго дня , суть вопроса в чем, нужно забрать из бд строки с их комментариями, но так чтобы коменты были как массив или объект.
вот сам запрос
SELECT *, ST_AsText(geo) as geo, 
                        ST_DISTANCE(ST_GeomFromText('LINESTRING(
                        $data->d15)'), geo) * 100 AS distance,
                        cities.name as city_name,
                        spots.name as name,
                        spots.lng as lng,
                        spots.lat as lat,
                        spots.id as id
                        spots_comments.created_at as comment_date
                        FROM spots
                        LEFT JOIN cities ON  spots.id_city = cities.id
                        LEFT JOIN spots_comments ON  spots.id  = spots_comments.spot_id
                        WHERE category = 1
                        HAVING distance < 0.3
                        ORDER BY distance

как сделать условно так
obj(id:123, name: qwe , comments : [1:qwe , 2: qweq ...])
был варик заюзать груп_конкат на коменты, и уже на фронте парсить по сепаратору ,но так се затея тк хз как поставить ограничение на выборку коментов, условно если их там 500+будет парсинг займет много времени, тем более что они обновляться будут каждые 20сек...
есть варик как сделать так ?
или можно как-то зафигачить такой запрос в Yii ? чтобы сразу со связью забирать ?
  • Вопрос задан
  • 136 просмотров
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
1) Агрегационные функции по типу груп бай очень серьезно сказываются на времени запроса.
2)
если их там 500+будет парсинг займет много времени
Естественно, по уму надо таскать только свежие/обновленные, иначе точно наступит жпа. А со свежими естественно выборка уже будет совсем небольшой.

Хинт: Я бы не стал заморачиваться с жсоном или аггрегацией вообще в запросе, думаю парсинг массива на бэке имхо будет гораздо быстрее запроса, что в принципе не сложно проверить, если есть готовая база.
Ответ написан
Комментировать
Immortal_pony
@Immortal_pony Куратор тега MySQL
IF(COUNT(`spots_comments`.`id`) = 0, '[]', CONCAT(
    '[', 
    GROUP_CONCAT(JSON_OBJECT(
        'id', `spots_comments`.`id`,
        'created', `spots_comments`.`created`,
        'current', `spots_comments`.`text`,
    ) ORDER BY `spots_comments`.`created` DESC),
    ']'
)) AS 'lastComments'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы