使用 CodeIgniter 查询构建器方法在子查询上进行 JOIN 查询

问题描述 投票:0回答:4

可以使用 CI 的查询生成器方法生成以下查询吗?

SELECT name 
FROM table1 t1 
JOIN 
     (SELECT ID FROM table2 ORDER BY id LIMIT 5) t2 
     ON t2.id=t1.t2_id 
WHERE t1.id>5
php codeigniter join subquery query-builder
4个回答
22
投票

有几种方法可以做到这一点。这里有一种方法,那就是 hack。

如何将此 SQL 重写到 CodeIgniter 的 Active Records 中?

这另一种方法非常简单。

$this->db
        ->select('ID')
        ->from('table2')
        ->order_by('id')
        ->limit('5');   

$subquery = $this->db->_compile_select();

$this->db->_reset_select(); 

$query  =       $this->db
                    ->select('t1.name')
                    ->from('table1 t1 ')
                    ->join("($subquery)  t2","t2.id = t1.t2_id")
                    ->get('table1 t1');

关于它的一些观点。
您必须在子查询中使用 from 子句,因为 get 运行查询。
在 codeigniter 2 中,无法访问 _compile_select 和 _reset_select,因为它们是受保护的方法。
您可能需要删除 system/database/DB_active_rec.php 中两种方法之前的关键字

这篇文章也很有用。


5
投票

在CI3中,只需使用第四个参数即可进行转义

$this->db->from('table')
->join('SELECT id from table2 where something=%s) as T2'),'table.id=T2.id', 'LEFT',NULL)
->get()->row();

不要忘记转义子查询中的参数以避免 SQL 注入。


0
投票

这个库可以帮助您通过查询构建器使用子查询,请查看这个库的文档

使用查询生成器的子查询


0
投票

子查询可以安全地构建为已编译的选择字符串,该字符串将馈送到父查询构建中。

get_where()
整合了通常需要的
from()
调用、
where()
调用和
get()
调用。

$sub = $this->db
    ->select('id')
    ->order_by('id', 'ASC')
    ->limit(5)
    ->get_compiled_select('table2');

return $this->db
    ->select('t1.name')
    ->join("($sub) t2", 't2.id = t1.t2_id')
    ->get_where('table1 t1', ['t1.id >' => 5])
    ->result();

根据数据库方言/驱动程序,呈现的 SQL 应类似于:

SELECT `t1`.`name`
FROM `table1` `t1`
JOIN (
    SELECT `id`
    FROM `table2`
    ORDER BY `id` ASC
    LIMIT 5
) `t2` ON `t2`.`id` = `t1`.`t2_id`
WHERE `t1`.`id` > 5
© www.soinside.com 2019 - 2024. All rights reserved.