【问题标题】:Is there a way to sort JSON entries, in mysql, based on a field?有没有办法在 mysql 中根据字段对 JSON 条目进行排序?
【发布时间】:2022-01-26 16:49:09
【问题描述】:

我想在 mysql 中根据我的 date_requested 字段对 JSON 数组进行排序,顺序将是升序的。我能做到吗?

数组是这样的:

SET @nonSorted= '[
{
    "id": "119",
    "date_end": "2022-01-04 18:30:00",
    "occupied": "0",
    "date_begin": "2022-01-04 16:00:00",
    "idCategory": "2",
    "date_requested": "2022-01-01 11:14:39"
},
{
    "id": "134",
    "date_end": "2022-01-06 11:30:00",
    "occupied": "0",
    "date_begin": "2022-01-06 08:00:00",
    "idCategory": "4",
    "date_requested": "2022-01-02 16:15:49"
},
{
    "id": "142",
    "date_end": "2022-01-09 11:00:00",
    "occupied": "1",
    "date_begin": "2022-01-09 08:30:00",
    "idCategory": "4",
    "date_requested": "2022-01-01 18:11:20"
}
]';

希望按字段 date_requested 对数组进行排序,我还尝试了在 stackoverflow 上找到的一些解决方案,但在我的情况下似乎不起作用。输出应该是这样的:

'[{
    "id": "119",
    "date_end": "2022-01-04 18:30:00",
    "occupied": "0",
    "date_begin": "2022-01-04 16:00:00",
    "idCategory": "2",
    "date_requested": "2022-01-01 11:14:39"
},{
    "id": "142",
    "date_end": "2022-01-09 11:00:00",
    "occupied": "1",
    "date_begin": "2022-01-09 08:30:00",
    "idCategory": "4",
    "date_requested": "2022-01-01 18:11:20"
},{
    "id": "134",
    "date_end": "2022-01-06 11:30:00",
    "occupied": "0",
    "date_begin": "2022-01-06 08:00:00",
    "idCategory": "4",
    "date_requested": "2022-01-02 16:15:49"
}
]'

【问题讨论】:

  • 什么是精确 MySQL版本?
  • 为什么使用 JSON?您有一个数组,其中每个元素都是具有相同字段集的对象。这应该是另一个普通表,有六列。然后 JSON 的所有麻烦都消失了。您可以高效地进行搜索和排序,并且很容易编写查询来执行此操作。

标签: mysql json


【解决方案1】:

MySQL 8 的可能解决方案:

SELECT JSON_ARRAYAGG(object)
FROM (
    SELECT object
    FROM JSON_TABLE(@nonSorted,
                    '$[*]' COLUMNS (object JSON PATH '$',
                                    date_requested DATETIME PATH '$.date_requested')) jsontable
    ORDER BY date_requested LIMIT 18446744073709551615
) parsed;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b4d7a5ffa690becda0fad27cc9d0a326

【讨论】:

  • 在 SO (Why is (18446744073709551615 == -1) true?) 上看到这个问题,我想知道为什么上面的查询有限制...(/me 只是好奇)
  • @Luuk LIMIT 用于禁止 ORDER BY ignoring。 LIMIT 子句的参数为 BIGINT UNSIGNED,该数据类型的使用值为 maxvalue。
  • 啊,解决这个问题的技巧/功能“JSON_ARRAYAGG 目前不能用作窗口函数。”
  • @Luuk 是的,JSON_ARRAYAGG 没有实现 ORDER BY 子句(就像在 GROUP_CONCAT 中一样)。
【解决方案2】:

这将以正确的顺序返回 3 个部分,您只需将它们合并回 1 个 JSON:

select 
   JSON_EXTRACT(jdoc, CONCAT("$[",t2.i,"]")) B
from t1 
cross join (select 0 as i union select 1 union select 2) t2
order by JSON_EXTRACT(jdoc, CONCAT("$[",t2.i,"].date_requested")) ASC;

输出:

B
{"id": "119", "date_end": "2022-01-04 18:30:00", "occupied": "0", "date_begin": "2022-01-04 16:00:00", "idCategory": "2", "date_requested": "2022-01-01 11:14:39"}
{"id": "142", "date_end": "2022-01-09 11:00:00", "occupied": "1", "date_begin": "2022-01-09 08:30:00", "idCategory": "4", "date_requested": "2022-01-01 18:11:20"}
{"id": "134", "date_end": "2022-01-06 11:30:00", "occupied": "0", "date_begin": "2022-01-06 08:00:00", "idCategory": "4", "date_requested": "2022-01-02 16:15:49"}

【讨论】:

    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2019-11-21
    相关资源
    最近更新 更多