
本文介绍如何将数据库中多个字段(如 technician_1 和 technician_2)的值统一归并统计,并动态生成 chart.js 柱状图的标签与数据,避免重复查询、提升可维护性与准确性。
本文介绍如何将数据库中多个字段(如 technician_1 和 technician_2)的值统一归并统计,并动态生成 chart.js 柱状图的标签与数据,避免重复查询、提升可维护性与准确性。
在使用 Chart.js 展示技术人员工单分布时,若数据分散在 technician_1 和 technician_2 两列中,直接为每个技术人员写四次独立 SQL 查询(如分别查 'Ema' 在两列中出现的总次数)不仅代码冗余,还极易出错(例如大小写不一致、漏加 OR 条件、未去重计数等)。正确的做法是:在数据库层完成聚合统计,一次性获取所有技术人员的总出现频次。
✅ 推荐方案:单次 SQL 聚合查询(高效且健壮)
使用 UNION ALL 将两列数据“堆叠”为一列,再通过 GROUP BY 统计频次。PHP 中只需一次查询即可获得完整数据:
<?php // 合并 technician_1 和 technician_2 的所有非空值,并统计频次
$sql = "SELECT technician, COUNT(*) as total
FROM (
SELECT technician_1 AS technician FROM tb_ticket WHERE technician_1 IS NOT NULL AND technician_1 != ''
UNION ALL
SELECT technician_2 AS technician FROM tb_ticket WHERE technician_2 IS NOT NULL AND technician_2 != ''
) AS t
GROUP BY technician
ORDER BY total DESC";
$result = mysqli_query($koneksi, $sql);
$labels = [];
$data = [];
while ($row = mysqli_fetch_assoc($result)) {
$labels[] = htmlspecialchars($row['technician']); // 防 XSS
$data[] = (int)$row['total'];
}
?>
随后在 Chart.js 初始化中直接注入 PHP 生成的数组:
<script>
var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: <?php echo json_encode($labels); ?>,
datasets: [{
label: '工单分配总数(含 technician_1 & technician_2)',
data: <?php echo json_encode($data); ?>,
backgroundColor: [
'#1B4F72', '#21618C', '#2874A6', '#2E86C1', '#3498DB', '#5DADE2'
].slice(0, <?php echo count($data); ?>)
}]
},
options: {
responsive: true,
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
precision: 0
}
}]
}
}
});
</script>
⚠️ 注意事项
- 大小写敏感问题:MySQL 默认对字符串比较区分大小写(取决于排序规则)。建议在 SQL 中统一转为小写统计(如 LOWER(technician_1)),或确保前端录入规范;
- 空值/空字符串过滤:务必添加 WHERE technician_x IS NOT NULL AND technician_x != '',避免统计脏数据;
- 安全性:使用 htmlspecialchars() 处理标签内容,json_encode() 输出数据,杜绝 XSS 与 JSON 格式错误;
- 扩展性:该方案天然支持新增技术人员(如 'Ryan'),无需修改 PHP 或 SQL —— 只需确保新值存入任一列即可自动纳入统计。
✅ 总结
与其为每个技术人员硬编码多条 WHERE technician_1='X' OR technician_2='X' 查询(易错、难维护),不如用一次聚合 SQL 完成全部统计。这不仅显著减少数据库交互次数、提升性能,更让 Chart.js 数据源清晰、可预测、可持续演进。真正的数据可视化最佳实践,始于优雅的数据准备。











