Недопустимая группа функций использования с использованием вложенного JSON_ARRAYAGG()

#mysql #sql #nested-queries

#mysql #sql #подзапрос

Вопрос:

У меня есть следующий простой запрос

 select 
    jrt.threadId,
    JSON_ARRAYAGG(
        JSON_OBJECT(
        'roundId',jrr.roundId,
        'bets', JSON_ARRAYAGG(
                    JSON_OBJECT(
                        'betId', bets.betId,
                        'amount', bets.amount
                    )
            )
        )
    ) as rounds
from threads jrt
    left join rounds jrr on jrt.threadId = jrr.threadId
            left join bets on jrr.roundId= bets.roundId
group by jrt.threadId
  

Что существенно работает, если я удаляю bets из первых JSON_OBJECT значений ключа.

Мне трудно понять точную причину ошибки, поскольку она мало что говорит.

 {"code":"ER_INVALID_GROUP_FUNC_USE","errno":1111}
  

Запрос также работает, если я использую JSON_ARRAY агрегатную функцию on bets , вместо JSON_ARRAYAGG .

Если Bets это агрегат, почему JSON_ARRAYAGG выдается ошибка?

Комментарии:

1. у вас есть какие-нибудь образцы данных для вашего запроса? кроме того, в вашем запросе есть ошибка, связанная с групповой функцией, в json_object слишком много запятой для ставок

2. Агрегатные функции НЕ МОГУТ быть вложенными.

Ответ №1:

Вложенный JSON_ARRAYAGG не разрешен, вместо этого вы должны использовать вложенный запрос. Я изменил ваш запрос, следующий должен работать

 select 
            jrt.threadId,
            JSON_ARRAYAGG(
                JSON_OBJECT(
                'roundId',jrr.roundId,
                'bets',( select  JSON_ARRAYAGG(
                            JSON_OBJECT(
                                'betId', bets.betId,
                                'amount', bets.amount
                            ) from threads jrt
            left join rounds jrr on jrt.threadId = jrr.threadId
                    left join bets on jrr.roundId= bets.roundId
                    ))
                )
            ) as rounds
        from threads jrt
            left join rounds jrr on jrt.threadId = jrr.threadId
                    left join bets on jrr.roundId= bets.roundId
        group by jrt.threadId
  

если кто-то может оптимизировать его дальше, дайте мне знать