You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分逗号implode存储的数据并统计explode后每个值的出现次数

解决方案

你可以选择PHP层拆分统计(兼容性最好,适配所有MySQL版本)或者MySQL层直接拆分统计(适合MySQL 8.0及以上版本,逻辑更简洁)两种方案实现:

方案1:PHP层处理(推荐)

直接读取所有nama_tmp字段值,拆分后统计计数即可,代码修改如下:

var chart4; 
$(document).ready(function() {
    chart4 = new Highcharts.Chart({
        chart: {
            renderTo: 'mygraph4',
            type: 'column'
        },   
        title: {
            text: 'Grafik Mekanik'
        },
        xAxis: {
            categories: ['Mekanik']
        },
        yAxis: {
            title: {
                text: 'Total Perbaikan'
            }
        },
        series: [
            <?php 
            include "system/koneksi.php";
            // 初始化姓名计数数组
            $nameCount = [];
            $sql = "SELECT nama_tmp FROM tb_tmp";
            $query = mysqli_query($connect, $sql) or die(mysqli_error($connect));
            while($row = mysqli_fetch_array($query)) {
                // 按逗号拆分字符串,逐个去除前后空格后统计
                $names = explode(',', $row['nama_tmp']);
                foreach($names as $name) {
                    $trimmedName = trim($name);
                    if($trimmedName !== '') { // 跳过空值
                        $nameCount[$trimmedName] = isset($nameCount[$trimmedName]) ? $nameCount[$trimmedName]+1 : 1;
                    }
                }
            }
            // 输出图表需要的series数据
            foreach($nameCount as $name => $total) {
            ?>
            {
                name: '<?php echo addslashes($name); ?>',
                data: [<?php echo $total; ?>]
            },
            <?php } ?>
        ]
    });
}); 

该方案修改量小,同时修复了原代码的SQL逻辑错误、SQL注入风险,适配所有使用场景。

方案2:MySQL 8.0+ 直接拆分统计

如果你的数据库版本为MySQL 8.0及以上,可以通过递归CTE直接在SQL层完成拆分统计,性能更高:

WITH RECURSIVE split_names AS (
    -- 拆分第一条数据
    SELECT
        TRIM(SUBSTRING_INDEX(nama_tmp, ',', 1)) AS name,
        TRIM(SUBSTRING(nama_tmp FROM LENGTH(SUBSTRING_INDEX(nama_tmp, ',', 1)) + 2)) AS remaining
    FROM tb_tmp
    WHERE nama_tmp != ''
    UNION ALL
    -- 递归拆分剩余字符串
    SELECT
        TRIM(SUBSTRING_INDEX(remaining, ',', 1)) AS name,
        TRIM(SUBSTRING(remaining FROM LENGTH(SUBSTRING_INDEX(remaining, ',', 1)) + 2)) AS remaining
    FROM split_names
    WHERE remaining != ''
)
SELECT name, COUNT(*) AS total
FROM split_names
GROUP BY name
ORDER BY total DESC;

直接执行上述SQL即可拿到每个姓名对应的出现次数,无需在PHP层做额外处理。


内容的提问来源于stack exchange,提问作者vivie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:18:00