插件窝 干货文章 如何在 MySQL 5.7 中统计 JSON 数组中特定值的计数?

如何在 MySQL 5.7 中统计 JSON 数组中特定值的计数?

JSON COUNT LENGTH value 907    来源:    2025-03-31

MySQL 5.7 中统计 JSON 数组中特定值的计数

在 MySQL 5.7 中,您可以使用 JSON 函数来处理和统计 JSON 数组中的特定值。以下是几种实现方法:

方法一:使用 JSON_TABLE 函数(MySQL 8.0+)

注意:MySQL 5.7 不支持 JSON_TABLE 函数,这是 MySQL 8.0 引入的功能。如果您使用的是 5.7,请参考下面的方法。

方法二:使用 JSON_LENGTH 和 JSON_SEARCH 组合(MySQL 5.7)

SELECT 
    id,
    JSON_LENGTH(json_column) AS total_elements,
    (
        SELECT COUNT(*) 
        FROM (
            SELECT 1 
            FROM JSON_TABLE(
                JSON_ARRAY(1,2,3,2,2,4), -- 替换为您的JSON数组列
                '$[*]' COLUMNS(
                    value INT PATH '$'
                )
            ) AS jt 
            WHERE jt.value = 2 -- 替换为您要查找的值
        ) AS t
    ) AS count_of_value
FROM your_table;

方法三:使用存储过程

DELIMITER //
CREATE FUNCTION count_json_array_value(json_array JSON, search_value VARCHAR(255)) 
RETURNS INT
DETERMINISTIC
BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE count INT DEFAULT 0;
    DECLARE array_length INT;
    DECLARE current_value VARCHAR(255);

    SET array_length = JSON_LENGTH(json_array);

    WHILE i < array_length DO
        SET current_value = JSON_UNQUOTE(JSON_EXTRACT(json_array, CONCAT('$[', i, ']')));
        IF current_value = search_value THEN
            SET count = count + 1;
        END IF;
        SET i = i + 1;
    END WHILE;

    RETURN count;
END //
DELIMITER ;

-- 使用示例
SELECT count_json_array_value(json_column, 'value_to_count') FROM your_table;

方法四:使用字符串操作(适用于简单情况)

SELECT 
    id,
    (LENGTH(json_column) - LENGTH(REPLACE(json_column, '"value_to_count"', ''))) / LENGTH('"value_to_count"') AS count
FROM your_table;

实际示例

假设有一个表 products 包含 JSON 列 tags,存储产品标签数组:

-- 创建示例表
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    tags JSON
);

-- 插入示例数据
INSERT INTO products (name, tags) VALUES
('Product 1', '["electronics", "sale", "new"]'),
('Product 2', '["clothing", "sale"]'),
('Product 3', '["electronics", "premium"]');

-- 统计包含"electronics"标签的产品数量
SELECT COUNT(*) 
FROM products 
WHERE JSON_CONTAINS(tags, '"electronics"');

-- 统计每个产品中"sale"标签出现的次数
SELECT 
    id, 
    name,
    (LENGTH(tags) - LENGTH(REPLACE(tags, '"sale"', ''))) / LENGTH('"sale"') AS sale_count
FROM products;

注意事项

  1. MySQL 5.7 的 JSON 功能比 8.0 有限,某些操作可能需要变通方法
  2. 对于大型 JSON 数组,性能可能会受到影响
  3. 考虑升级到 MySQL 8.0 以获得更完善的 JSON 支持

希望这些方法能帮助您在 MySQL 5.7 中统计 JSON 数组中的特定值计数!