2016-12-15 244 views
1

我想多列从一个表转换成单一的JSON在另一个表中MySQL数据库(16年7月5日版)。我想使用SQL查询。MySQL的转换多个列成JSON

一台这个样子的

CREATE TABLE `log_old` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `temperature` DECIMAL(5,2) NULL DEFAULT NULL, 
    `heating_requested` BIT(1) NULL DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    )COLLATE='utf8_general_ci' 
    ENGINE=InnoDB; 

二表看起来像这样

CREATE TABLE `log_new` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    'data' JSON, 
    PRIMARY KEY (`id`), 
    )COLLATE='utf8_general_ci' 
    ENGINE=InnoDB; 

数据JSON在log_new表的所有行相同的格式,它应该是这样的

{ 
    temperature: value, 
    heatingRequested: false 
} 

例如log_old这个样子

+--+-----------+-----------------+ 
|id|temperature|heating_requested| 
+--+-----------+-----------------+ 
|1 | 12  |  true  | 
+--+-----------+-----------------+ 
|2 | 14  |  true  | 
+--+-----------+-----------------+ 
|3 | 20  |  false | 
+--+-----------+-----------------+ 

,我想log_new这个样子

+--+-----------------------------------------+ 
|id|    data      | 
+--+-----------------------------------------+ 
|1 |{temperature:12, heatingRequested: true} | 
+--+-----------------------------------------+ 
|2 |{temperature:14, heatingRequested: true} | 
+--+-----------------------------------------+ 
|3 |{temperature:20, heatingRequested: false}| 
+--+-----------------------------------------+ 

我试图用JSON_INSERT()

SELECT JSON_INSERT((SELECT data FROM log_new ), '$.temperature', 
    (SELECT temperature FROM log_old)); 

但这抛出错误 “子查询返回多个1行” 我来了仅这就是工作的解决方案,同时使用,做到这一点逐行但是这可能需要很长一段时间

DELIMITER // 
    CREATE PROCEDURE doLog() 
    BEGIN 
    SELECT COUNT(*) into @length from log_zone; 
    SET @selectedid = 1; 
    WHILE @selectedid < @length DO 
     SELECT temperature,heating_requested INTO @temperature,@heating_requested FROM log_old where [email protected];  
     SELECT JSON_OBJECT('temperature',@temperature,'heatingRequested',@heating_requested) into @data_json; 
     SET @selectedid = @selectedid + 1; 
     INSERT INTO log_new (data) VALUES (@data_json); 
    END WHILE; 
    END; 
    // 
    CALL doLog() 
+0

双方你的子查询((SELECT FROM log_new数据), '$ .temperature',(SELECT温度log_old));'返回多个行,以便错误是正确的。检查插入选择语法 - http://dev.mysql.com/doc/refman/5.7/en/insert-select.html - 并将你的函数重写为一个语句,它将从'select json_object(...)中进行批量插入... '在整个表 – JosMac

+0

'INSERT INTO log_new(数据) SELECT JSON_OBJECT(“温度”,(SELECT温度log_old));'你觉得这个林不知道如果我理解你 – Morme

+0

嵌套的选择仍然会产生更多的呢?。每行外部选择1行,至少需要将条件添加到嵌套选择中,但更好 - 在一个选择中连接两个表。 – JosMac

回答

1

由于所有的数据都可以在单一的线,你不需要使用子查询或循环构建JSON对象。

你可以尝试这样的:在'选择JSON_INSERT

INSERT INTO log_new (data) 
    SELECT json_object('temperature',log_old.temperature,'heatingRequested',log_old.heating_requested) 
    FROM log_old