大家好,我有一个表,其中的一个字段是json,格式如下:

{
  "monday": [{"end": "18:00:00", "start": "09:00:00"}, {"end": "21:00:00", "start": "19:00:01"}], 
  "sunday": [{"end": "15:00:00", "start": "14:00:00"}],  
  "saturday": [{"end": "18:00:00", "start": "09:00:00"}]
}

我想知道是否可以在SELECT查询中返回所有键及其数组项,如下所示:

day date_start date_end
monday 09:00:00 18:00:00
monday 19:00:01 21:00:00
sunday 14:00:00 15:00:00
saturday 09:00:00 18:00:00

我试过这样做:

SELECT j.* 
  FROM tabela t
INNER JOIN JSON_TABLE(
    t.field_json,
    '$.*[*]'
    COLUMNS(
        `date_start` TIME PATH '$.start',
        `date_end` TIME PATH '$.end',
        `day` VARCHAR(10) PATH '$.*'
    )
) AS j 
WHERE t.id=100

但结果并不是我想要的:

day date_start date_end
NULL 09:00:00 18:00:00
NULL 19:00:01 21:00:00
NULL 14:00:00 15:00:00
NULL 09:00:00 18:00:00

Db:https://dbfiddle.uk/9rXd_VL2

有什么建议吗?

推荐答案

您需要创建一个JSON_TABLE()作为顶级JSON对象的键.然后是每个键下相应数组的另一个JSON_table().

SELECT id, d.day, j.start, j.end
FROM tablea
CROSS JOIN JSON_TABLE(JSON_KEYS(field_json), '$[*]' 
    COLUMNS (day VARCHAR(10) PATH '$')) AS d
CROSS JOIN JSON_TABLE(JSON_EXTRACT(field_json, CONCAT('$.', d.day)), '$[*]'
    COLUMNS (`start` TIME PATH '$.start', end TIME PATH '$.end')) AS j;

Dbfiddle

与MySQL中JSON的大多数使用一样,如果您将数据存储在普通的行和列中,这会容易得多.JSON使最初存储数据变得很容易,但它使编写大多数SQL查询变得困难得多.

Mysql相关问答推荐

如何在循环查询中删除默认架构?

错误:数据包顺序错误.GET:0预期:10 node JS MySQL

使用JSON_CONTAINS搜索多个值的原理

为什么 MAX 函数通过调用在 group 中生成正确的结果

Mysql:使用like Select 查询

没有 ORDER BY 的查询性能很高,有 ORDER BY 的查询速度慢得像爬行一样

将类图转换为SQL数据库

如何创建一个列,该列在另一个表中具有值的计数?

Golang中使用Gorm的Where条件转义字符无法正常工作的问题

如何使用mysql更新列中的json数据

Select 最高等级最多的部门名称

如何根据 R 中的价格范围将数据从一列复制到新列?

如何查询打印已售罄的产品? [MYSQL]

SQL 查找边界之间的值

什么是 PyMySQL,它与 MySQLdb 有何不同?它会影响 Django 部署吗?

MySQL SELECT 增量计数器

在 Yii2 中执行原始 SQL 查询?

比较 MySQL 中的日期忽略 DateTime 字段的时间部分

MySQL 的最大并发连接数

MySQL合并两列并添加到一个新列中