【问题标题】:MariaDB 5.5 how to count repeat value in a json?MariaDB 5.5 如何计算 json 中的重复值?
【发布时间】: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 不是存储您想要进行此类查询的内容的地方。

标签: mysql sql mariadb


【解决方案1】:

下面的脚本可以给你一些想法。评估性能问题,其中包括您的表可以拥有的行数。修改和调整脚本中需要的所有内容:

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

【讨论】:

    猜你喜欢
    • 2019-03-24
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2018-09-01
    相关资源
    最近更新 更多