#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
если кто-то может оптимизировать его дальше, дайте мне знать