【发布时间】:2018-05-13 23:41:49
【问题描述】:
我有一个 MySQL 表 authors,其中包含 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"
| | }
| | }
-----------------------------------------------------------------------
如您所见,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"]');
此查询执行搜索并返回整个 published_books JSON。但我只想要那些 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"
}
【问题讨论】:
-
您找到解决方案了吗?
-
是否有充分的理由不存储标准化数据?
-
@NicoHaase 旨在减少频繁的保存/更新查询。这只是一个示例,我们有一个复杂的大 JSON,我们将其转换为具有关系的对象,使用它并进行最终保存。使用该对象也很容易,因为它已经加载了相关的对象(存在于 JSON 本身中)。如果必须将其规范化为多个表,则保存/更新非常困难。这种方法专门针对我们的领域进行了优化。
-
@Yep_It's_Me,不。加载记录后,我在 Ruby 中过滤了结果
-
@MuhammadTahirQaiser 我找到了任何解决方案。加载记录后,我在 Ruby 中过滤了结果。
标签: mysql mysql-5.7 mysql-json json-query