首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL嵌套JSON列搜索和提取子JSON

问MySQL嵌套JSON列搜索和提取子JSON
EN

Stack Overflow用户
提问于 2017-11-30 05:56:52
回答 2查看 9.1K关注 0票数 14

我有一个MySQL表authors,其中包含id、name和published_books列。在这里,published_books是一个JSON列。用样本数据,

代码语言:javascript
复制
id | name  | published_books
-----------------------------------------------------------------------
1  | Tina  |  {
   |       |    "17e9bf8f": {
   |       |         "name": "Book 1",
   |       |         "tags": [
   |       |             "self Help",
   |       |             "Social"
   |       |         ],
   |       |         "language": "English",
   |       |         "release_date": "2017-05-01"
   |       |     },
   |       |      "8e8b2470": {
   |       |          "name": "Book 2",
   |       |          "tags": [
   |       |              "Inspirational"
   |       |          ],
   |       |          "language": "English",
   |       |          "release_date": "2017-05-01"
   |       |      }
   |       |   }
-----------------------------------------------------------------------
2  | John  |   {
   |       |     "8e8b2470": {
   |       |         "name": "Book 4",
   |       |         "tags": [
   |       |             "Social"
   |       |         ],
   |       |         "language": "Tamil",
   |       |         "release_date": "2017-05-01"
   |       |     }
   |       |   }
-----------------------------------------------------------------------
3  | Keith |   {
   |       |      "17e9bf8f": {
   |       |          "name": "Book 5",
   |       |          "tags": [
   |       |              "Comedy"
   |       |          ],
   |       |          "language": "French",
   |       |          "release_date": "2017-05-01"
   |       |      },
   |       |      "8e8b2470": {
   |       |          "name": "Book 6",
   |       |          "tags": [
   |       |              "Social",
   |       |              "Life"
   |       |          ],
   |       |          "language": "English",
   |       |          "release_date": "2017-05-01"
   |       |      }
   |       |   }
-----------------------------------------------------------------------

正如您所看到的,published_books列有嵌套的JSON数据(一个级别)。JSON将动态UUID作为键,其值将作为JSON的图书详细信息。

我希望搜索具有特定条件的books,并仅提取那些图书JSON数据作为结果返回。

我写的那个问题,

代码语言:javascript
复制
select JSON_EXTRACT(published_books, '$.*') from authors 
   where JSON_CONTAINS(published_books->'$.*.language', '"English"')     
   and JSON_CONTAINS(published_books->'$.*.tags', '["Social"]');

此查询执行搜索并返回整个published_books JSON。但我只想要那些书JSON。

预期的结果,

代码语言:javascript
复制
result
--------
"17e9bf8f": {
    "name": "Book 1",
    "tags": [
        "self Help",
        "Social"
    ],
    "language": "English",
    "release_date": "2017-05-01"
}
-----------
"8e8b2470": {
    "name": "Book 6",
    "tags": [
        "Social",
        "Life"
    ],
    "language": "English",
    "release_date": "2017-05-01"
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-18 23:14:11

目前还没有用"WHERE"-like逻辑过滤文档或数组元素的JSON函数。

但是这是一些使用JSON数据的人可能想要完成的任务,因此MySQL提供的解决方案是使用表()函数将JSON文档转换成一种格式,就像将数据存储在普通表中一样。然后,可以对返回的字段使用标准的SQL子句。

您不能在MySQL 5.7中使用这个函数,但是如果升级到MySQL 8.0,您可以这样做。

代码语言:javascript
复制
select authors.id, authors.name, books.* from authors,
  json_table(published_books, '$.*' 
  columns(
    bookid for ordinality,
    name text path '$.name',
    tags json path '$.tags',
    language text path '$.language',
    release_date date path '$.release_date')
  ) as books
where books.language = 'English'
  and json_search(tags, 'one', 'Social') is not null;

+----+-------+--------+--------+-------------------------+----------+--------------+
| id | name  | bookid | name   | tags                    | language | release_date |
+----+-------+--------+--------+-------------------------+----------+--------------+
|  1 | Tina  |      1 | Book 1 | ["self Help", "Social"] | English  | 2017-05-01   |
|  3 | Keith |      2 | Book 6 | ["Social", "Life"]      | English  | 2017-05-01   |
+----+-------+--------+--------+-------------------------+----------+--------------+

注意,即使使用JSON_TABLE(),嵌套的JSON数组仍然很难使用。在本例中,我将tags公开为JSON数组,然后使用JSON_SEARCH()查找所需的标记。

我同意Rick的观点--您最好将数据存储在规范化的表和列中。您认为使用JSON会为您节省一些工作,但它不会,它可能会使将数据存储为单个JSON文档而不是跨几个表的多行更方便,但您只需重新解压JSON,才能以您想要的方式查询它。

此外,如果您用JSON存储数据,则每次查询数据时都必须解决这种JSON_TABLE()表达式。与正常存储数据相比,将为您持续提供更多的工作。

坦率地说,我还没有看到关于在MySQL中使用JSON的问题,如果数据的结构不需要改变,那么在关系表中存储数据比使用JSON更好。

票数 10
EN

Stack Overflow用户

发布于 2019-02-18 18:58:09

你在向后走。

在插入数据时执行提取。插入少量表格(作者、书籍、标签,也许还有几个),并在它们之间建立关系。在这个数据库中不需要JSON。

结果是一个易于查询和快速的数据库.但是,它需要学习RDBMS和SQL。

当数据是随机信息的集合时,JSON是有用的。您的JSON非常正常,因此数据非常适合RDBMS技术。在这种情况下,JSON只是序列化数据的一种标准方法。但是它不应该被用来查询。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47566765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档