无公共字段时如何在CodeIgniter中关联三张MySQL表?
在CodeIgniter中关联无直接公共字段的三张MySQL表
嘿,我来帮你搞定这个问题!首先得澄清一个关键点:如果三张表完全没有任何可关联的字段,那只能做笛卡尔积(交叉连接),但这几乎没有实际业务价值。所以我推测你说的是「三张表不是两两直接关联,而是通过中间表间接串联」——就像你给出的表1(Deposit Details)和表2(Deposit Master)通过deposit_master_id关联,表2又能和第三张表(比如Bank或Branch)通过bank_id/branch_id关联,而表1和第三张表没有直接公共字段。下面就基于这种最常见的场景来演示实现方法:
先补全表结构(方便演示)
我先把你没写完的部分补上,假设第三张表是Bank:
- 表1:
deposit_details(Deposit Details)id | deposit_type | amount | deposit_master_id 1 | Fixed | 100000 | 1 - 表2:
deposit_master(Deposit Master)deposit_master_id | bank_id | branch_id 1 | 1 | 1 - 表3:
bankbank_id | bank_name 1 | State Bank of India
方法1:用CodeIgniter的Active Record(推荐)
CodeIgniter的Active Record支持多次join调用,哪怕两张表没有直接关联字段,只要通过中间表能串起来就行。直接在Model里写就行:
示例Model代码
public function get_deposit_with_bank_info() { // 只选需要的字段,别一股脑选*,避免冗余 $this->db->select('dd.id, dd.deposit_type, dd.amount, dm.bank_id, b.bank_name'); // 给表起别名,写起来更清爽 $this->db->from('deposit_details dd'); // 第一步:关联Deposit Master,表1和表2靠deposit_master_id关联 $this->db->join('deposit_master dm', 'dd.deposit_master_id = dm.deposit_master_id', 'inner'); // 第二步:关联Bank表,表2和表3靠bank_id关联(表1和表3没直接字段,靠表2中转) $this->db->join('bank b', 'dm.bank_id = b.bank_id', 'inner'); // 执行查询,返回结果集 return $this->db->get()->result(); }
小提示
join的第三个参数是连接类型:inner是内连接(只返回匹配的行),left是左连接(返回左表所有行,右表匹配的行),根据你的业务需求选就行。- 如果第三张表是
Branch,把最后一个join换成关联branch表,条件改成dm.branch_id = branch.branch_id就ok。
方法2:直接写原生SQL
如果你更喜欢写原生SQL,也可以用$this->db->query()执行:
public function get_deposit_with_bank_info() { $sql = "SELECT dd.id, dd.deposit_type, dd.amount, dm.bank_id, b.bank_name FROM deposit_details dd INNER JOIN deposit_master dm ON dd.deposit_master_id = dm.deposit_master_id INNER JOIN bank b ON dm.bank_id = b.bank_id"; return $this->db->query($sql)->result(); }
极端情况:三张表完全无关联字段
如果真的三张表没有任何可关联的字段(比如一个存存款、一个存员工、一个存产品,完全不搭边),那只能做交叉连接,CodeIgniter里可以这么写:
public function cross_join_all_tables() { $this->db->select('*'); $this->db->from('deposit_details'); // 用1=1触发交叉连接 $this->db->join('deposit_master', '1=1', 'cross'); $this->db->join('bank', '1=1', 'cross'); return $this->db->get()->result(); }
但这种查询会返回所有表的笛卡尔积,数据量会爆炸式增长,几乎没有实际业务场景会用到,除非你真的有特殊需求。
内容的提问来源于stack exchange,提问作者Sudhi Sr
相关产品推荐
相关产品推荐

