如何从 MySQL 列中的 JSON 文档中获取最新值?

Posted

技术标签:

【中文标题】如何从 MySQL 列中的 JSON 文档中获取最新值?【英文标题】:How to get the latest value from the JSON document inside MySQL column? 【发布时间】:2020-11-10 05:40:22 【问题描述】:

mysql版本为8.0.18-commercial 我编写了以下查询,显示来自details 列的结果

select details from table t1;

Output:
[
  
    "Msg": "Job Running",
    "Task": "IN_PROGRESS",
    "Date": "2020-07-20 16:25:15",
  ,
  
    "Msg": "Job failed",
    "Task": "IN_PROGRESS",
    "Date": "2020-07-20 16:35:24",
  
]

我只想要 Msg 值来自具有最新 Date 的最后一个元素

我想要的输出是显示带有latest date 的元素的Msg

ColumnName      ColumnValue
Msg             Job failed

我写了以下查询,但它给出了null 输出

select details->>"$.Msg" from table t1;

【问题讨论】:

所以***.com/questions/39906435/… 了解如何将 JSON 数组转换为行。然后您可以使用***.com/questions/7745609/… 获取具有最新值的行。 你想要最后一个数组元素的消息,还是最新日期元素的消息? 我想要最新日期元素的消息 出于好奇,您为什么将其存储为 JSON?如果您以正常方式存储它会更容易,每个数组成员在一行中,每个对象字段在正常列中。在大多数情况下,将 JSON 用于此类结构数据会使查询 SQL 数据库中的数据变得更困难 我正在从 mongo 集合中迁移数据,它可以以 JSON 文档的形式迁移 【参考方案1】:

如果您正在运行 MySQ。 8.0,您可以使用json_table()将json数组取消嵌套到行,然后row_number()保持每个原始行的最新记录。

假设您的表的主键是id,您可以这样表述:

select msg, activity_date
from (
    select x.*, row_number() over(partition by t.id order by x.activity_date desc) rn
    from mytable t
    cross join json_table(
        t.details,
        '$[*]' columns(
            msg varchar(50) path '$.Msg',
            activity_date datetime path '$.activityDate'
        )
    ) x
) t
where rn = 1

Demo on DB Fiddle

味精 |活动日期 :--------- | :----------------- 作业失败 | 2020-07-20 16:35:24

【讨论】:

以上是关于如何从 MySQL 列中的 JSON 文档中获取最新值?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 id 在 MySQL 中的 json 整数数组列中获取相关项目

如何在 MySQL 中的 json 列上创建索引?

如何从代码中的文档库的选择列中获取选择值

如果 JSON 列中存在值(user_id),则获取 mysql 行

从 Mysql 中的数组内部的 Json 数据中获取值

MySQL_关于JSON数据的查询