我有如下sql查询,我想将原始SQL转换为CodeIgniter查询构建方法。
SELECT *
FROM color c
LEFT JOIN (
SELECT pc.*
FROM product_color pc
LEFT JOIN product p ON pc.product_id = p.product_id
WHERE p.product_id = 1
) x ON c.id = x.color_id
在 codeigniter 中,您可以使用 get_compiled_select 函数获取已编译的查询。
我们首先创建内部查询。
$inner_query = $this->db->select('pc.*')
->from('product_color pc')
->join('product p','pc.product_id = p.product_id','left')
->where('p.product_id',1)
->get_compiled_select();
现在我们将使用内部查询来创建最终查询。
$final_query = $this->db->select('*')
->from('color c')
->join("($inner_query) x",'c.id=x.color_id','left')
->get_compiled_select();
echo $final_query; die;
在模型文件中尝试此操作。并且 sql 关键字最好保持大写。
$query = "SELECT * FROM color c
LEFT JOIN (SELECT pc.* FROM product_color pc
LEFT JOIN product p ON pc.product_id=p.product_id
WHERE p.product_id=1)x on c.id=x.color_id"
$query = $this->db->query($query);
$data = $query->result_array();
您想要的查询不需要 LEFT JOINed 子查询; SQL 可以简化为仅两个 LEFT JOIN。
SELECT c.*
FROM color c
LEFT JOIN product_color pc ON c.id = pc.color_id
LEFT JOIN product p ON pc.product_id = p.product_id
WHERE p.product_id = 1;
或更简洁地使用
USING
:
SELECT c.*
FROM color c
LEFT JOIN product_color pc ON c.id = pc.color_id
LEFT JOIN product p USING (product_id)
WHERE p.product_id = 1;
链式查询构建器脚本可以通过以下方式实现:
return $this->db
->select('c.*')
->join('product_color pc', 'c.id = pc.color_id', 'LEFT')
->join('product p', 'product_id', 'LEFT')
->get_where('color c', ['p.product_id' => 1])
->result();
上面的脚本将生成一个 SQL 查询,其中所有表和列名都被正确引用,并将返回一个包含零个或多个对象的数组。