Kan*_*van 8 mysql mysql-5.7 mysql-json json-query
我有一个authors带有列的MySQL表id,name和published_books.在这里,published_books是一个JSON列.有样本数据,
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"
| | }
| | }
-----------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
如您所见,该published_books列具有嵌套的JSON数据(一级).JSON将动态UUID作为键,其值将作为JSON的书籍详细信息.
我想搜索books某些条件并单独提取这些书籍JSON数据作为结果返回.
我写的查询,
select JSON_EXTRACT(published_books, '$.*') from authors
where JSON_CONTAINS(published_books->'$.*.language', '"English"')
and JSON_CONTAINS(published_books->'$.*.tags', '["Social"]');
Run Code Online (Sandbox Code Playgroud)
此查询执行搜索并返回整个published_booksJSON.但我只想要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"
}
Run Code Online (Sandbox Code Playgroud)
尚无JSON函数可使用类似“ WHERE”的逻辑过滤文档或数组的元素。
但这是某些使用JSON数据的人可能想要完成的任务,因此MySQL提供的解决方案是使用JSON_TABLE()函数将JSON文档转换为一种格式,就好像您将数据存储在普通表中一样。然后,您可以对返回的字段使用标准的SQL WHERE子句。
您不能在MySQL 5.7中使用此功能,但如果升级到MySQL 8.0,则可以执行此操作。
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 |
+----+-------+--------+--------+-------------------------+----------+--------------+
Run Code Online (Sandbox Code Playgroud)
请注意,即使使用,嵌套的JSON数组仍然很难使用JSON_TABLE()。在此示例中,我将公开tags为JSON数组,然后使用JSON_SEARCH()来查找所需的标签。
我同意Rick James的观点-您最好将数据存储在规范化的表和列中。您认为使用JSON可以节省您一些工作,但事实并非如此。这可能使将数据存储为单个JSON文档而不是将多个表中的多行数据存储起来更为方便,但是您只需要再次解开JSON即可查询所需的方式。
此外,如果将数据存储在JSON中,JSON_TABLE()则每次查询数据时都必须解决这种表达式。与正常存储数据相比,这将为您带来更多的持续工作。
坦白说,我还没有在Stack Overflow上看到一个关于在MySQL上使用JSON的问题,如果没有数据结构不需要将JSON存储在关系表中的结论,那么就不会得出结论。变化。
| 归档时间: |
|
| 查看次数: |
2002 次 |
| 最近记录: |