如何从 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 整数数组列中获取相关项目