MariaDB 5.5如何计算json中的重复值?

时间:2017-10-16 10:58:51

标签: mysql sql mariadb

作为标题,有如下数据:

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

任何人都知道如何计算重复值如ID 01有2个计数ID 03有3个计数

1 个答案:

答案 0 :(得分: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