如何计算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 - 获取数组中相同值的计数