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_name | male | female |
|---|---|---|
| Marketing | 2 | 1 |
| Manager | 1 | 1 |
内容的提问来源于stack exchange,提问作者Roy Andika
相关产品推荐
相关产品推荐

