You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无公共字段时如何在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: bank
    bank_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:13:36