MySQL嵌套JSON列搜索并提取子JSON

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

我有一个MySQL表qazxsw poi,列qazxsw poi,qazxsw poi和qazxsw poi。在这里,authors是一个JSON专栏。有样本数据,

id

如您所见,name列具有嵌套的JSON数据(一级)。 JSON将动态UUID作为键,其值将作为JSON的书籍详细信息。

我想在某些条件下搜索published_books并单独提取这些书JSON数据以返回结果。

我写的查询,

published_books

此查询执行搜索并返回整个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" | | } | | } ----------------------------------------------------------------------- JSON。但我只想要JSON这些书。

预期的结果,

published_books
mysql mysql-5.7 mysql-json json-query
2个回答
5
投票

还没有JSON函数可以使用类似“WHERE”的逻辑过滤文档或数组的元素。

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

您不能在MySQL 5.7中使用此功能,但如果您升级到MySQL 8.0,则可以执行此操作。

select JSON_EXTRACT(published_books, '$.*') from authors 
   where JSON_CONTAINS(published_books->'$.*.language', '"English"')     
   and JSON_CONTAINS(published_books->'$.*.tags', '["Social"]');

请注意,即使使用published_books,嵌套的JSON数组仍然难以使用。在这个例子中,我将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" } 暴露为JSON数组,然后使用JSON_TABLE() function查找所需的标记。

我同意Rick James的意见 - 您也可以将数据存储在规范化的表格和列中。您认为使用JSON会为您节省一些工作,但事实并非如此。将数据存储为单个JSON文档而不是跨多个表存储多行可能会更方便,但您只需要再次解开JSON,然后才能按照自己的方式进行查询。

此外,如果以JSON格式存储数据,则每次要查询数据时都必须解决此类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 | +----+-------+--------+--------+-------------------------+----------+--------------+ 表达式。与您正常存储数据相比,这将为您提供更多的工作。

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


3
投票

你正在向后接近任务。

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

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

当数据是随机内容的集合时,JSON很有用。您的JSON非常规则,因此数据非常适合RDBMS技术。在这种情况下,JSON只是序列化数据的标准方法。但它不应该用于查询。

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