我想从json数据中计算唯一键,该数据存储在多行中

时间:2016-06-25 05:27:22

标签: php mysql json

我在表中有多个json行

例如

row1 -> {"json_key_1":{"ele":"value"},"json_key2":{"ele":"value""}}

row2 -> {"json_key_10":{"ele":"value"},"json_key20":{"ele":"value""}}

row3 -> {"json_key_1":{"ele":"value"},"json_key20":{"ele":"value""}}

row4 -> {"json_key_2":{"ele":"value"},"json_key30":{"ele":"value""}}

在这四个json行中,我必须计算唯一键

例如。 " json_key_2"它存在于row1-> josn和row4-> json

所以我希望通过存储过程或一些Query从所有json中获取唯一键 这应该只计算一次,即使存在多个json行

每个密钥只计数一次json_key_1,json_key2,json_key_10,json_key_20,json_key_30

在此示例中,KEY COUNT结果应为:5

在MySQL 5.7中,我们有在JSON上执行操作的函数

喜欢:json_merge(),json_length()如何使用它们来实现这个结果。

这可能在MYSQL中吗?

我创建了一个存储过程来获取结果

SELECT `json_row` INTO @ar1
FROM `table` 
WHERE row_id=1;

SELECT `json_row` INTO @ar2
FROM `table` 
WHERE row_id=2;

SELECT `json_row` INTO @ar3
FROM `table` 
WHERE row_id=3;

SELECT `json_row` INTO @ar4
FROM `table` 
WHERE row_id=4;

SELECT json_merge(@ar1,@ar2,@ar3,@ar4) INTO @result;

SELECT json_length(@result);

此Query返回结果json_keys的长度为:5

我想改进此查询

任何人都可以建议如何做出更好的选择查询,因为在这里我通过row_id逐个选择每个json_row。

但是如果我在where子句中使用一些user_id而不是row_id

SELECT Query将返回该用户的4行,然后如何将4行存储到变量中以执行json_merge()和json_length()。

1 个答案:

答案 0 :(得分:0)

最后我得到了解决方案我正在寻找的东西我试图计算json_key 从多个json行开始,现在我可以在MYSQL CURSOR的帮助下完成这个。

DECLARE curs_row CURSOR FOR SELECT `json_data` FROM `table`  where `user_id`=26972;

curs_row将逐个处理多行进入循环,我可以合并和 使用单个SELECT查询使用此存储过程计算json长度。

以下是完整查询:

BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE email_list JSON DEFAULT '{}';
DECLARE get_list JSON DEFAULT '{}';
DECLARE merge_email_list JSON DEFAULT '{}';
DECLARE curs_row CURSOR FOR SELECT `json_data` FROM `table`  where `user_id`=26972;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN curs_row;
read_loop: LOOP
FETCH curs_row INTO email_list;
IF done THEN
LEAVE read_loop;
END IF;
SELECT email_list INTO get_list;
SELECT json_merge(get_list,merge_email_list) INTO merge_email_list;
END LOOP;
SELECT json_length(merge_email_list);
CLOSE curs_row;
END

所以解决方案是游标循环我在这里添加此解决方案 也许这会对别人有所帮助。