如何计算MySQL JSON数组中每个值的计数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何计算MySQL JSON数组中每个值的计数?相关的知识,希望对你有一定的参考价值。

我有一个mysql表,具有以下定义:

mysql> desc person;
+--------+---------+------+-----+---------+-------+
| Field  | Type    | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| id     | int(11) | NO   | PRI | NULL    |       |
| name   | text    | YES  |     | NULL    |       |
| fruits | json    | YES  |     | NULL    |       |
+--------+---------+------+-----+---------+-------+

该表具有一些示例数据,如下所示:

mysql> select * from person;
+----+------+---------------------------------+
| id | name | fruits                          |
+----+------+---------------------------------+
|  1 | Tom  | ["apple", "orange"]             |
|  2 | John | ["apple", "mango"]              |
|  3 | Tony | ["apple", "mango", "strawberry"] |
+----+------+---------------------------------+

如何计算每种水果的总出现次数?例如:

+------------+-------+
| fruit      | count |    
+------------+-------+
| apple      | 3     |
| orange     | 1     |
| mango      | 2     | 
| strawberry | 1     |
+------------+-------+

一些研究表明,可以使用JSON_LENGTH函数,但找不到与我的情况类似的示例。

答案

[如果没有先创建一个每个水果一行的表,就无法做到这一点。

CREATE TABLE allfruits (fruit VARCHAR(10) PRIMARY KEY);
INSERT INTO allfruits VALUES ('apple'), ('orange'), ('mango'), ('strawberry');

没有从JSON生成此内容的好方法。

一旦有了该表,就可以将其连接到JSON,然后使用GROUP BY来计算出现的次数。

SELECT fruit, COUNT(*) AS count
FROM allfruits
JOIN person ON JSON_SEARCH(person.fruits, 'one', fruit) IS NOT NULL
GROUP BY fruit;

输出:

+------------+-------+
| fruit      | count |
+------------+-------+
| apple      |     3 |
| mango      |     2 |
| orange     |     1 |
| strawberry |     1 |
+------------+-------+

请注意,它将在人员表上进行表扫描以找到每个水果。这是相当低效的,并且随着您的人员表越来越大,它将成为性能问题。

如果要针对此类查询进行优化,则不应使用JSON来存储一系列水果。您应该以标准化的方式存储数据,用另一个表表示人与水果之间的多对多关系。

这与我对Is storing a delimited list in a database column really that bad?的回答有关>

另一答案

您可以对数组的所有三个组件的每个值(“ apple”,“ mango”,“ strawberry”和“ orange”)使用JSON_EXTRACT()函数,然后使用条件聚合,然后应用UNION ALL来合并所有这样的查询:

另一答案

我认为最简单的解决方案是使用JSON_TABLE函数。

以上是关于如何计算MySQL JSON数组中每个值的计数?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取列中每个不同值的计数? [复制]

ActionScript 3.0 - 获取数组中相同值的计数

如何使用MySQL查询某个列中相同值的数量统计

如何将对象列表转换为对象列表数组,每个数组索引都有 2 个计数?

计数排序vs基数排序vs桶排序

SQL:计算每个设备集连续出现相同值的所有记录并返回最高计数