我有查询,可以计算连接表中的 id。我需要将返回的表与数据库中的另一个表联合。
从第一个查询返回的表有 4 列:
- group_id
- 计数
- 名字
- 描述
我想与第一个合并的表有 3 列:
- group_id
- 名字
- 描述
我通过phpmyadmin运行查询,它工作得很好。查询:
SELECT group_id, size, name, description
FROM(SELECT *, count(group_id) as size
FROM table1
GROUP BY group_id) as tmp
JOIN table2
ON tmp.group_id = table2.group_id
UNION
SELECT id, 0 as size, name, description
FROM table2
但是当我尝试使用代码点火器进行查询时,它不起作用。
错误:"字段列表"中的未知列"0"
SELECT id, 0 as size, name, description
FROM table2
这是模块中的代码点火器代码:
$this->db->select('group_id, size, name, description');
$this->db->from('(select *, count(group_id) as size from table1 group by group_id) as tmp');
$this->db->join('table2', 'tmp.group_id=table2.id');
$this->db->get();
$query1 = $this->db->last_query();
$this->db->select('id, 0 as size, name, description');
$this->db->from('table2');
$this->db->get();
$query2 = $this->db->last_query();
$this->db->query($query1. ' UNION ' .$query2);
$query = $this->db->get();
return $query->result_array();
为了使故事简短,我需要知道如何使用 Codeigniter 制作占位符,或者是否有其他更好的方法来获得我需要的结果?
通过将FALSE
值添加为 codeigniter 的活动记录select()
函数的第二个参数来转义select
查询。
所以,它应该写成:
$this->db->select('id, 0 as size, name, description',FALSE);
当您FALSE
值添加到它的第二个参数时,codeigniter 不会保留第一个参数,以通过查询backtick
字符进行初始化。
get_compiled_select()
实际上并不执行SQL,适用于创建子查询和联合查询。 只需从最深到最浅的查询工作。
所有 SELECT 查询都将享受 Codeigniter 的 ActiveRecord 查询构建方法提供的保护和格式化。
public function modelMethodWithSubqueryAndUnion(): array
{
$subquery = $this->db
->select("group_id, COUNT(1) AS size")
->from("table1")
->groupBy("group_id")
->get_compiled_select();
$query1 = $this->db
->select("group_id, size, name, description")
->from("($subquery) AS tmp")
->join("table2", "tmp.group_id = table2.group_id")
->get_compiled_select();
$query2 = $this->db
->select("id, 0 AS size, name, description")
->from("table2")
->get_compiled_select();
return $this->db->query("$query1 UNION $query2")->result_array();
}
*我没有测试上面的代码,也没有考虑提问者的原始SQL是否经过优化/合理。此答案应仅视为如何使用get_compiled_select()
构建准备好的查询段的演示。 若要检查上次调用的呈现查询,请使用 $this->db->last_query()
。