2017-10-16 52 views
-1

如題,有一個數據如下:MariaDB 5.5如何統計json中的重複值?

|ID|jsoncolumn| 
|01|{'01':'pass','01':'pass','02':'pass','03':'pass','03':'pass','03':'pass'} | 

任何一個知道如何計算重複的值,比如ID 01有2個字ID 03有3個計數

+0

JSON不是存儲您想要爲其執行查詢的東西的地方。 –

回答

0

下面的腳本可以給你一些想法。由於表格可能具有的行數,評估性能問題等等。修改並調整腳本中所需的所有內容:

MariaDB[_]> DROP TEMPORARY TABLE IF EXISTS `tmp_tbl`; 
Query OK, 0 rows affected, 1 warning (0.00 sec) 

MariaDB[_]> DROP TABLE IF EXISTS `tbl`; 
Query OK, 0 rows affected, 1 warning (0.00 sec) 

MariaDB[_]> CREATE TABLE IF NOT EXISTS `tbl` (
     -> `id` SERIAL, 
     -> `jsoncolumn` BLOB 
     ->); 
Query OK, 0 rows affected (0.00 sec) 

MariaDB[_]> CREATE TEMPORARY TABLE IF NOT EXISTS `tmp_tbl` (
     -> `id` BIGINT, 
     -> `value` VARCHAR(255) 
     ->); 
Query OK, 0 rows affected (0.00 sec) 

MariaDB[_]> INSERT INTO `tbl` 
     -> (`jsoncolumn`) 
     -> VALUES 
     -> ("{'01':'pass','01':'pass','02':'pass','03':'pass','03':'pass','03':'pass'}"); 
Query OK, 1 row affected (0.00 sec) 

MariaDB[_]> SELECT 
     -> CONCAT('(', `id`, ', "', 
     ->  REPLACE(
     ->   REPLACE(
     ->   REPLACE(`jsoncolumn`, '}', ''), 
     ->   '{', ''), 
     ->   ',', CONCAT('"), (', `id`, ', "') 
     -> ), '")' 
     -> ) INTO @`_value` 
     -> FROM `tbl` 
     -> WHERE `id` = 1; 
Query OK, 1 row affected (0.00 sec) 

MariaDB[_]> SET @`insert` := CONCAT(' 
     '> INSERT INTO `tmp_tbl` (`id`, `value`) 
     '> VALUES ', @`_value`); 
Query OK, 0 rows affected (0.00 sec) 

MariaDB[_]> SELECT @`insert`; 
+-------------------------------------------------------------------------------------------------------------------------------+ 
| @`insert`                              | 
+-------------------------------------------------------------------------------------------------------------------------------+ 
| INSERT INTO `tmp_tbl` (`id`, `value`) 
    VALUES (1, "'01':'pass'"), (1, "'01':'pass'"), (1, "'02':'pass'"), (1, "'03':'pass'"), (1, "'03':'pass'"), (1, "'03':'pass'") | 
+-------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

MariaDB[_]> PREPARE `stmt` FROM @`insert`; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 

MariaDB[_]> EXECUTE `stmt`; 
Query OK, 6 rows affected (0.00 sec) 
Records: 6 Duplicates: 0 Warnings: 0 

MariaDB[_]> DEALLOCATE PREPARE `stmt`; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB[_]> SELECT `id`, `value`, COUNT(`id`) `COUNT` 
     -> FROM `tmp_tbl` 
     -> GROUP BY `id`, `value`, LEFT(`value`, LOCATE(':', `value`) - 1) 
     -> ORDER BY `value`; 
+------+-------------+-------+ 
| id | value  | COUNT | 
+------+-------------+-------+ 
| 1 | '01':'pass' |  2 | 
| 1 | '02':'pass' |  1 | 
| 1 | '03':'pass' |  3 | 
+------+-------------+-------+ 
3 rows in set (0.00 sec) 

MariaDB[_]> DROP TEMPORARY TABLE IF EXISTS `tmp_tbl`; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB[_]> DROP TABLE IF EXISTS `tbl`; 
Query OK, 0 rows affected (0.00 sec) 

請參閱dbfiddle