【发布时间】:2017-10-16 10:58:50
【问题描述】:
作为标题,有如下数据:
|ID|jsoncolumn|
|01|{'01':'pass','01':'pass','02':'pass','03':'pass','03':'pass','03':'pass'} |
任何人都知道如何计算重复值,例如 ID 01 有 2 个计数 ID 03 有 3 个计数
【问题讨论】:
-
JSON 不是存储您想要进行此类查询的内容的地方。
作为标题,有如下数据:
|ID|jsoncolumn|
|01|{'01':'pass','01':'pass','02':'pass','03':'pass','03':'pass','03':'pass'} |
任何人都知道如何计算重复值,例如 ID 01 有 2 个计数 ID 03 有 3 个计数
【问题讨论】:
下面的脚本可以给你一些想法。评估性能问题,其中包括您的表可以拥有的行数。修改和调整脚本中需要的所有内容:
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。
【讨论】: