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

如何在CodeIgniter中合并两个查询以对比学生两学期成绩

在CodeIgniter中实现双学期成绩对比查询

嘿,我来帮你把这个MySQL查询转换成CodeIgniter的实现方式,其实有两种常用的思路,你可以根据自己的习惯选择:

方法一:直接执行原生SQL语句

这是最直接的方式,因为你已经有了现成的验证过的MySQL查询,直接用CI的数据库类执行就行:

// 把你的原生SQL语句赋值给变量
$sql = "select x.student, x.2017, y.2018 
        from (SELECT a.student_id student, sum(a.marks) 2017 FROM a a WHERE a.year = '2017' GROUP by student ) x 
        LEFT JOIN (SELECT b.student_id student, sum(b.marks) 2018 FROM b b WHERE b.year = '2018' GROUP by student ) y 
        on x.student = y.student";

// 执行查询
$query = $this->db->query($sql);

// 获取查询结果,可根据需求选result()(对象数组)或result_array()(关联数组)
$results = $query->result_array();

这种方法的好处是完全复用你已经调试好的SQL,不需要额外修改,适合复杂查询场景。

方法二:使用CodeIgniter查询构造器构建

如果你更倾向于用CI的查询构造器来写(方便后续维护,也能更贴合框架编码规范),可以通过子查询的方式实现:

// 构建2017年成绩的子查询
$subquery_2017 = $this->db->select('student_id as student, sum(marks) as 2017')
                          ->from('a')
                          ->where('year', '2017')
                          ->group_by('student_id')
                          ->get_compiled_select();

// 构建2018年成绩的子查询
$subquery_2018 = $this->db->select('student_id as student, sum(marks) as 2018')
                          ->from('b')
                          ->where('year', '2018')
                          ->group_by('student_id')
                          ->get_compiled_select();

// 主查询:将两个子查询作为临时表进行左连接
$query = $this->db->select('x.student, x.2017, y.2018')
                  ->from("($subquery_2017) as x")
                  ->join("($subquery_2018) as y", 'x.student = y.student', 'left')
                  ->get();

// 获取结果
$results = $query->result_array();

这里的get_compiled_select()方法会把查询构造器的链式调用转换成对应的SQL字符串,这样我们就能把它当作临时表用在from和join语句中。

两种方法都能得到你想要的对比结果,你可以根据项目的编码规范来选择~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:11:32