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

求助:将含自连接子查询的MySQL语句转为CodeIgniter查询构建器

转换MySQL同表内连接为CodeIgniter查询构建器语法

没问题,我帮你把这条MySQL查询转换成CodeIgniter的查询构建器语法,先理清楚原查询的逻辑:它通过嵌套子查询先提取每个employee_id对应的created_on,再和原answers表关联筛选出对应记录,最后按创建时间倒序排列。

CodeIgniter 3 实现方式

// 构建最内层子查询:获取employee_id和created_on并重命名
$subquery1 = $this->db->select('employee_id as test_employee_id, created_on as test_created_on')
                      ->get_compiled_select('answers');

// 构建中间层子查询:按employee_id分组
$subquery2 = $this->db->select('*')
                      ->from("($subquery1) as test")
                      ->group_by('test.test_employee_id')
                      ->get_compiled_select();

// 主查询:关联原表和子查询,筛选并排序
$query = $this->db->select('answers.*')
                  ->from('answers')
                  ->join("($subquery2) as test", "test.test_employee_id = answers.employee_id AND test.test_created_on = answers.created_on", 'inner')
                  ->order_by('answers.created_on', 'DESC')
                  ->get();

// 获取最终结果
$results = $query->result();

CodeIgniter 4 实现方式

如果你用的是CodeIgniter 4,写法类似,只是调用方式略有不同:

$db = \Config\Database::connect();

// 最内层子查询
$subquery1 = $db->table('answers')
                ->select('employee_id as test_employee_id, created_on as test_created_on')
                ->compileSelect();

// 中间层子查询
$subquery2 = $db->table("($subquery1) as test")
                ->select('*')
                ->groupBy('test.test_employee_id')
                ->compileSelect();

// 主查询
$query = $db->table('answers')
            ->select('answers.*')
            ->join("($subquery2) as test", "test.test_employee_id = answers.employee_id AND test.test_created_on = answers.created_on", 'inner')
            ->orderBy('answers.created_on', 'DESC')
            ->get();

$results = $query->getResult();

优化建议(可选)

原查询的分组逻辑在MySQL严格模式下可能会触发警告(因为test_created_on没有被聚合或包含在分组字段中)。如果你的需求是获取每个员工最新的回答记录,可以优化子查询,用MAX(created_on)明确获取每个员工的最新创建时间,这样更符合SQL规范:

优化后的MySQL语句:

SELECT answers.* 
FROM answers 
INNER JOIN (
    SELECT employee_id as test_employee_id, MAX(created_on) as test_created_on 
    FROM answers 
    GROUP BY employee_id
) AS test ON test.test_employee_id = answers.employee_id AND test.test_created_on = answers.created_on 
ORDER BY answers.created_on DESC

对应的CodeIgniter 3简化写法:

$subquery = $this->db->select('employee_id as test_employee_id, MAX(created_on) as test_created_on')
                     ->from('answers')
                     ->group_by('employee_id')
                     ->get_compiled_select();

$query = $this->db->select('answers.*')
                  ->from('answers')
                  ->join("($subquery) as test", "test.test_employee_id = answers.employee_id AND test.test_created_on = answers.created_on", 'inner')
                  ->order_by('answers.created_on', 'DESC')
                  ->get();

$results = $query->result();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:12:44