在 MySQL 5.7 中,JSON 类型字段常被用来存储灵活的结构化数据,例如把用户的标签放在一个 JSON 数组中。当我们需要统计某个特定元素(比如标签 "php")在整张表中一共出现了多少次时,可以借助 JSON 函数与数字辅助表来实现。

示例表结构
假设我们有一张文章表,其中 tags 字段是 JSON 数组类型,建表语句如下:
CREATE TABLE article (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100),
tags JSON
);
INSERT INTO article(title, tags) VALUES
('文章A', '["php", "mysql", "linux"]'),
('文章B', '["php", "redis"]'),
('文章C', '["python", "mysql"]');
核心思路
MySQL 5.7 没有可以直接把 JSON 数组展开成多行的函数,但我们可以利用一个存储了连续数字的小表(辅助表),结合 JSON_EXTRACT 按索引提取元素,再通过条件统计完成计数。
创建数字辅助表
CREATE TABLE num_helper (i INT); INSERT INTO num_helper(i) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
展开 JSON 数组并统计
下面的 SQL 会把每篇文章的 tags 数组按索引展开,并统计元素 "php" 的出现次数:
SELECT COUNT(*) AS php_count
FROM article a
JOIN num_helper n ON n.i < JSON_LENGTH(a.tags)
WHERE JSON_EXTRACT(a.tags, CONCAT('$[', n.i, ']')) = '"php"';
其中 JSON_LENGTH 获取数组长度,JSON_EXTRACT 按位置取出元素。由于 JSON_EXTRACT 返回带引号的字符串,所以比较时要用 '"php"'。
封装为通用统计方式
如果希望统计任意给定元素的次数,可以用用户变量传入目标值:
SET @target = 'mysql';
SELECT COUNT(*) AS target_count
FROM article a
JOIN num_helper n ON n.i < JSON_LENGTH(a.tags)
WHERE JSON_UNQUOTE(JSON_EXTRACT(a.tags, CONCAT('$[', n.i, ']'))) = @target;
这里使用 JSON_UNQUOTE 去掉引号,使比较更直观。只要辅助表数字范围覆盖实际数组最大长度,统计结果就是准确的。
小结
在 MySQL 5.7 中统计 JSON 数组内特定元素的使用次数,关键是利用 JSON_LENGTH 控制展开边界,用 JSON_EXTRACT 取值,再配合数字辅助表做行转列。这种方式完全在数据库内完成,避免了应用层循环查询,适合报表和运营统计场景。
MySQL_5.7JSONJSON_ARRAY统计次数JSON_EXTRACT修改时间:2026-07-25 08:27:16