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

CodeIgniter实现部门男女员工统计及SQL分组报错解决

解决方法与代码修改

首先,你遇到的1055错误是因为MySQL的sql_mode=only_full_group_by模式要求:SELECT语句中的所有非聚合列必须出现在GROUP BY子句中。你原来的查询用了SELECT *,同时只按sex分组,这导致大量非聚合列(比如id_worker、id_dept等)不在GROUP BY里,违反了该模式的规则。

更重要的是,你的需求是按部门统计男女数量,所以原来的分组逻辑(按sex分组)完全不符合目标,需要重新设计查询逻辑。

1. 修改Model代码(核心查询调整)

将count_sex_dept方法修改为按部门分组,使用条件聚合来统计每个部门的男女人数:

public function count_sex_dept() {
    // 明确选择需要的字段,用条件聚合统计男女数量
    $this->db->select('
        dept_tb.dept_name,
        SUM(CASE WHEN worker_tb.sex = "m" THEN 1 ELSE 0 END) as male,
        SUM(CASE WHEN worker_tb.sex = "w" THEN 1 ELSE 0 END) as female
    ', FALSE);
    
    $this->db->from('worker_tb');
    $this->db->join('job_tb', 'job_tb.id_worker = worker_tb.id_worker');
    $this->db->join('dept_tb', 'dept_tb.id_dept = job_tb.id_dept');
    
    // 按部门的唯一标识分组,符合only_full_group_by要求
    $this->db->group_by('dept_tb.id_dept, dept_tb.dept_name');
    
    $query = $this->db->get();
    // 简化返回逻辑,直接返回查询结果集
    return $query->result();
}
  • 这里用SUM(CASE...)实现条件统计:当性别为m时计1,否则计0,求和后得到该部门男性总数;女性同理。
  • GROUP BY子句包含部门的id_dept和dept_name,确保所有非聚合列都在分组条件中,符合SQL模式要求。

2. 修改View代码(适配新的数据结构)

现在返回的数据是每个部门一行,包含dept_name、male、female三个字段,所以调整View展示逻辑:

<div class="col-md-12">
    <!-- 表头 -->
    <div class="row font-weight-bold">
        <div class="col-md-4">
            <label>Department Name</label>
        </div>
        <div class="col-md-4">
            <label>Male</label>
        </div>
        <div class="col-md-4">
            <label>Female</label>
        </div>
    </div>

    <!-- 循环渲染每个部门的统计数据 -->
    <?php foreach($count_sex_dept as $sd) { ?>
    <div class="row">
        <div class="col-md-4">
            <p><?php echo $sd->dept_name; ?></p>
        </div>
        <div class="col-md-4">
            <p><?php echo $sd->male; ?></p>
        </div>
        <div class="col-md-4">
            <p><?php echo $sd->female; ?></p>
        </div>
    </div>
    <?php } ?>
</div>

3. Controller代码无需修改

你的Controller逻辑是正确的,只需保持原样即可:

public function count_sex() {
    $data['count_sex_dept'] = $this->m_worker->count_sex_dept();
    $this->load->view('count_sex', $data);
}

这样修改后,就能得到你想要的视图结果:

dept_namemalefemale
Marketing21
Manager11

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:52:37