最近开发项目时需要使用子查询,研究一番后得出结果:
<?php
// Sub Query
$this->db->select('*');
$this->db->from('TableB');
$subQuery = $this->db->get_compiled_select();
// Main Query
$this->db->select('*');
$this->db->from('TableA');
$this->db->join("($subQuery) AS TableB", 'TableA.id = TableB.a_id');
$r = $this->db->get();
return $r->result_array();
?>
另外也发现一个情形:
TableA LEFT JOIN TableB on TableA.id=TableB.a_id,如果TableB有限制条件(ex. WHERE TableB.age > 15),需要使用子查询的形式或是在on设置条件优先过滤再join,否则会变成Inner Join。
-- 变成Inner Join
Select *
From TableA
Left Join TableB on TableA.id = TableB.a_id
Where
TableB.age > 15
-- Left Join正确的结果
Select *
From TableA
Left Join
(Select *
From TableB
where TableB.age > 15)
AS TableB on TableA.id = TableB.a_id
-- 在on先对右表做过滤,再join
Select *
From TableA
Left Join TableB on
TableA.id = TableB.a_id
and TableB.age > 15