如何订购,mysql中的一个json_object

Tuy*_*yas 0 mysql sql arrays json group-by

我在对 JSON_OBJECT 进行排序时遇到问题:

在此处输入图片说明

如何按照 JSON OBJECT 中的对象对对象进行排序?

Blo*_*erD 8

@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 不起作用。”


GMB*_*GMB 5

您无法控制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子句中的所有非聚合列;这是大多数数据库的要求,也是一种良好的编码习惯。

  • @Bergi:它有一个适用于窗口本身的“order by”子句,而不是正在聚合的值...... (2认同)
  • @Macoshark:“group_concat()”对生成的字符串默认限制为 1000 个字符(当然,您可以手动增加)。此外,此选项的效率可能低于内置函数(这是两个函数调用,而不是一个)。唉,这是目前唯一可用的选择。遗憾的是 MySQL 没有提供这样的排序选项,而 JSON 规范确实指定数组中元素的排序*是*有意义的。 (2认同)