MySQL在JSON数组中选择所有ID和子ID

问题描述 投票:0回答:2

我有一个数据col,其中包含一些记录为json数组,例如

[
  {
    "id": 4065,
    "pageTitle": "Lorem Ipsum",
    "children": [
        {
        "id": 4067,
        "pageTitle": "Foo",
      },
      {
        "id": 4072,
        "pageTitle": "Bar",
      }
  },
  {
    "id": 4070,
    "pageTitle": "Another Lorem Ipsum",
    "children": [
        {
        "id": 4068,
        "pageTitle": "Another Foo",
      },
      {
        "id": 4073,
        "pageTitle": "Another Bar",
      }
  }
]

我在下面的查询是获取所有父ID并忽略子ID

SELECT JSON_EXTRACT(data, "$[*].id")
FROM `my_table`;

// Returns only 4065 & 4067

即使对于儿童元素或大孩子等,我如何获取和所有ID?

还有一种方法可以将结果作为单索引数组返回,比如

[4065, 4067, 4072, 4070, 4068, 4073]

或者这需要以编程方式处理,例如php?

mysql json select
2个回答
0
投票

在MySQL 5.7中,JSON函数有些限制。但是你可以提供JSON_EXTRACT的多条路径,所以如果你的桌子深度不超过2级(即孙子,但没有曾孙子),那么这将有效:

SELECT JSON_EXTRACT(data, "$[*].id", '$[*].children[*].id', '$[*].children[*].children[*].id')
FROM my_table

Demo on dbfiddle


0
投票

不是mysql的答案,如果你的系统上有jq,你可以使用这个脚本

jq '[..|.id?]' file

这将遍历整个JSON数据文件(无论它有多深),如果找到id密钥,它将打印其关联值。

Demo on jqplay

© www.soinside.com 2019 - 2024. All rights reserved.