如何在CodeIgniter中通过SELECT查询获取MySQL两张表的全部记录
嘿,这个需求得看你两张表的关系来选合适的方案,我给你分两种常见场景详细说下CodeIgniter里的实现方式:
场景1:两张表无关联,需要合并所有记录
如果users和employers是完全独立的表(比如分别存普通用户和企业用户,没有关联字段),想要把两张表的所有记录合并成一个结果集,那得用UNION或者UNION ALL。
注意:UNION会自动去重重复的记录,而UNION ALL只是简单合并,性能更好,如果你不需要去重优先用它。另外,两张表的查询结果列数必须一致,对应列的类型要兼容,要是列数不一样,得用NULL来补全缺失的列。
用CodeIgniter Query Builder实现
// 先查users表,给employers独有的列补NULL(比如company_name) $this->db->select('id, name, email, NULL AS company_name'); $this->db->from('users'); // 用union_all()代替union()可以跳过去重,提升性能 $this->db->union_all(); // 再查employers表,对应列要和前面的查询匹配 $this->db->select('id, name, email, company_name'); $this->db->from('employers'); // 执行查询并获取结果 $query = $this->db->get(); $all_records = $query->result(); // 返回对象数组,用result_array()返回关联数组
用原生SQL实现
如果Query Builder写起来麻烦,直接用原生SQL更灵活:
$sql = " SELECT id, name, email, NULL AS company_name FROM users UNION ALL SELECT id, name, email, company_name FROM employers "; $query = $this->db->query($sql); $all_records = $query->result();
场景2:两张表有关联,需要关联查询记录
如果users和employers之间有关联字段(比如employers表有user_id关联users表的id),想要获取关联在一起的记录,就用JOIN查询,常见的有LEFT JOIN(保留users表所有记录,即使没有对应的employer)和INNER JOIN(只返回两边都有匹配的记录)。
用CodeIgniter Query Builder实现
// 建议指定具体列,避免重复列名(比如两张表都有id的话,会被覆盖) $this->db->select('users.id AS user_id, users.name AS user_name, users.email, employers.id AS employer_id, employers.company_name'); $this->db->from('users'); // 第三个参数'left'表示左连接,换成'inner'就是内连接 $this->db->join('employers', 'users.id = employers.user_id', 'left'); $query = $this->db->get(); $related_records = $query->result();
用原生SQL实现
$sql = " SELECT users.id AS user_id, users.name AS user_name, users.email, employers.id AS employer_id, employers.company_name FROM users LEFT JOIN employers ON users.id = employers.user_id "; $query = $this->db->query($sql); $related_records = $query->result();
额外注意点
- 如果两张表有同名的字段(比如
id),一定要给列加别名,否则结果里后面的列会覆盖前面的,导致数据错误。 - 用Query Builder的好处是自动处理SQL注入,原生SQL如果要加参数的话,记得用
$this->db->escape()或者绑定参数的方式,避免注入风险。
内容的提问来源于stack exchange,提问作者amit
相关产品推荐
相关产品推荐

