如何在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
相关产品推荐
相关产品推荐

