11

是否可以通过 CI Query Builder 类生成以下查询?

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
4

3 回答 3

21

那么有几种方法可以做到这一点。一种方法是在这里,这是一种黑客攻击。

如何将此 SQL 重写到 CodeIgniter 的活动记录中?

这种另一种方式非常简单。

$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 中的两种方法之前删除关键字

这篇文章也很有用。

于 2013-01-10T06:25:43.513 回答
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 注入。

于 2016-11-22T13:19:08.977 回答
0

这个库可以帮助你使用带有查询生成器的子查询查看这个库的文档

带有查询生成器的子查询

于 2013-01-10T07:04:44.713 回答