@Gordon Linoff 在这篇文章中的回答在 MySQL 8.0 上对我有用,但我没有测试它的可扩展性。
正如 @Simas Jonelinuas 的评论中所写,以下是该帖子的答案,以防链接失效。
SELECT A, json_arrayagg(json_obj('X',value1, 'Y',value2)) AS RESULT
FROM (SELECT . . .,
ROW_NUMBER() OVER (ORDER BY value2) as seqnum
FROM . . .
. . .
) x
GROUP BY A;
Run Code Online (Sandbox Code Playgroud)
引用:“显然,ROW_NUMBER() 设法对结果集进行排序,即使 ORDER BY 不起作用。”
您无法控制json_arrayagg()生成的数组中元素的顺序,即使在 MySQL 8.0 中,如文档中所述:
将结果集聚合为单个 JSON 数组,其元素由行组成。此数组中元素的顺序未定义。
一个丑陋且不可扩展的解决方法是使用group_concat()手动生成 json 数组:
select
dashboard,
widget,
...
concat(
'[',
group_concat(
json_object('color_mode', color_mode, ...)
order by <your_ordering_clumn>
),
']'
) js_array
from datadog_wigets_markers
group by dashboard, widget, ...
Run Code Online (Sandbox Code Playgroud)
这将在长 json 字符串上失败。我宁愿尝试使用json_arrayagg()无序数组。
旁注:您应该枚举group by子句中的所有非聚合列;这是大多数数据库的要求,也是一种良好的编码习惯。
| 归档时间: |
|
| 查看次数: |
2657 次 |
| 最近记录: |