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

求助:基于PHP+MySQL实现Google条形图展示年龄分组人数

问题修复与完整实现方案

1. 修正SQL查询语句

原SQL的核心问题是缺少JOIN关联条件,并且SELECT字段错误,无法正确按年龄分组统计。修正后的SQL会将tbl_evacuee中的evacuee_age与子查询的年龄区间关联,确保每个用户被分到对应的组,同时统计每个组的人数(包括人数为0的组):

SELECT 
    sub.`group` AS age_group,
    COUNT(tbl_evacuee.evacuee_id) AS `count`
FROM (
    SELECT 0 AS min_age, 12 AS max_age, '0-12' AS `group`
    UNION ALL 
    SELECT 13, 14, '13-14'
    UNION ALL
    SELECT 15, 19, '15-19'
    UNION ALL
    SELECT 20, 150, '20+'
) AS sub
LEFT JOIN tbl_evacuee 
    ON tbl_evacuee.evacuee_age BETWEEN sub.min_age AND sub.max_age
GROUP BY sub.`group`
ORDER BY sub.min_age;

关键修正点:

  • 使用LEFT JOIN替代INNER JOIN,确保即使分组内没有数据,也会返回该组(人数为0)
  • 添加ON关联条件,将用户年龄匹配到对应的区间组
  • 选择子查询的group字段作为分组名称,而非原表的evacuee_age
  • 用COUNT(tbl_evacuee.evacuee_id)统计有效用户数(避免分组无数据时统计为1)
  • 添加ORDER BY保证分组按年龄顺序展示

2. 修正Google Charts前端代码

原PHP输出存在JS语法错误(末尾多余逗号),且未处理style角色字段,修正后代码如下:

<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
google.charts.load('current', {'packages':['corechart']});
google.charts.setOnLoadCallback(drawChart);

function drawChart() {
    var data = google.visualization.arrayToDataTable([
        ['Age Group', 'Number of Evacuees', { role: 'style' }],
        <?php
        $firstRow = true;
        while($row = mysqli_fetch_assoc($run)) {
            // 避免末尾逗号导致JS语法错误
            if (!$firstRow) echo ",";
            // 为每个条形设置样式(可自定义)
            $style = "color: #3366cc";
            echo "['{$row['age_group']}', {$row['count']}, '{$style}']";
            $firstRow = false;
        }
        ?>
    ]);

    var options = {
        title: 'Evacuee Age Distribution',
        width: 600,
        height: 400,
        bar: {groupWidth: '75%'},
        legend: { position: 'none' },
    };

    var chart = new google.visualization.BarChart(document.getElementById('chart_div'));
    chart.draw(data, options);
}
</script>

<!-- 图表容器 -->
<div id="chart_div"></div>

关键修正点:

  • 引入Google Charts的加载器脚本(原代码缺失)
  • 处理PHP输出的逗号问题,避免JS数组语法错误
  • 补充style角色的样式值(可根据需求自定义颜色、填充等)
  • 添加完整的图表配置选项(标题、尺寸、图例等)
  • 指定图表容器元素,确保图表能渲染到页面上

3. 完整PHP数据查询流程

确保PHP正确连接数据库并执行查询:

<?php
// 数据库连接配置
$host = 'localhost';
$dbname = 'your_database';
$username = 'your_username';
$password = 'your_password';

// 创建连接
$conn = mysqli_connect($host, $username, $password, $dbname);

// 检查连接
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

// 执行修正后的SQL查询
$sql = "SELECT 
            sub.`group` AS age_group,
            COUNT(tbl_evacuee.evacuee_id) AS `count`
        FROM (
            SELECT 0 AS min_age, 12 AS max_age, '0-12' AS `group`
            UNION ALL 
            SELECT 13, 14, '13-14'
            UNION ALL
            SELECT 15, 19, '15-19'
            UNION ALL
            SELECT 20, 150, '20+'
        ) AS sub
        LEFT JOIN tbl_evacuee 
            ON tbl_evacuee.evacuee_age BETWEEN sub.min_age AND sub.max_age
        GROUP BY sub.`group`
        ORDER BY sub.min_age;";

$run = mysqli_query($conn, $sql);

// 检查查询是否成功
if (!$run) {
    die("Query failed: " . mysqli_error($conn));
}
?>

注意事项:

  • 替换your_database、your_username、your_password为实际数据库信息
  • 使用mysqli_fetch_assoc()替代mysqli_fetch_array(),避免索引混淆
  • 添加错误处理,便于排查连接或查询问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:30:59