【问题标题】:codeigniter mysql left join include selectcodeigniter mysql左连接包括选择
【发布时间】:2013-03-14 03:58:35
【问题描述】:

如何将左连接包括选择转换为codeigniter sql方法?谢谢。我只是想知道。

SELECT c1.c1_id, c1.c1_name, c2.c2_id, c2.c2_name, c2.c2_type, c2.c2_status, f.f_id, f.f_name, f2.f2_id, f2.f2_name FROM category2 c2 
LEFT JOIN category1 c1 ON c1.c1_id = c2.c1_id 
LEFT JOIN (
    SELECT DISTINCT c2_id, f_id, f_name FROM file ORDER BY f_id DESC
) f ON f.c2_id = c2.c2_id
LEFT JOIN (
    SELECT DISTINCT c2_id, f2_id, f2_name FROM file2 ORDER BY f2_id DESC
) f2 ON f2.c2_id = c2.c2_id
WHERE c2.c2_status = 1
GROUP BY c2.c2_id

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    您可以使用 codeigniter 的子查询方式来实现此目的,您将不得不破解 codeigniter。像这样 转到 system/database/DB_active_rec.php 从这些函数中删除 public 或 protected 关键字

    public function _compile_select($select_override = FALSE)
    public function _reset_select()
    

    现在可以写入子查询 现在这是您的带有活动记录的查询

    $select =   array('DISTINCT c2_id','f_id','f_name');
    $this->db->select($select);
    $this->db->from('file');
    $this->db->order_by('f_id','DESC');
    $subQuery1 = $this->db->_compile_select();
    
    unset($select);
    
    $this->db->_reset_select();
    
    $select =   array('DISTINCT c2_id','f_id','f2_name');
    $this->db->select($select);
    $this->db->from('file2');
    $this->db->order_by('f2_id','DESC');
    $subQuery2 = $this->db->_compile_select();
    
    unset($select); 
    
    $this->db->_reset_select();
    
    // And now your main query
    
    $select =   array(
                      'c1.c1_id',
                      'c1.c1_name',
                      'c2.c2_id',
                      'c2.c2_name',
                      'c2.c2_type',
                      'c2.c2_status',
                      'f.f_id',
                      'f.f_name',
                      'f2.f2_id',
                      'f2.f2_name'
                );
    
    $this->db->select($select);
    $this->db->from('category2 c2');
    $this->db->join("($subQuery1)",'f.c2_id = c2.c2_id','left');
    $this->db->join("($subQuery2)",'f2.c2_id = c2.c2_id','left');
    $this->db->where('c2.c2_status',1);
    $this->db->group_by('c2.c2_id');
    $main_query = $this->db->get();
    

    事情就完成了。干杯!!! 注意:在使用子查询时,您必须使用

    $this->db->from('myTable')
    

    而不是

    $this->db->get('myTable')
    

    运行查询。

    现在,您可以检查已构建为的查询

    echo $this->db->last_query();
    

    【讨论】:

      【解决方案2】:
      $query='SELECT c1.c1_id, c1.c1_name, c2.c2_id, c2.c2_name, c2.c2_type, c2.c2_status, f.f_id, f.f_name, f2.f2_id, f2.f2_name FROM category2 c2 
      LEFT JOIN category1 c1 ON c1.c1_id = c2.c1_id 
      LEFT JOIN (
          SELECT DISTINCT c2_id, f_id, f_name FROM file ORDER BY f_id DESC
      ) f ON f.c2_id = c2.c2_id
      LEFT JOIN (
          SELECT DISTINCT c2_id, f2_id, f2_name FROM file2 ORDER BY f2_id DESC
      ) f2 ON f2.c2_id = c2.c2_id
      WHERE c2.c2_status = ?
      GROUP BY c2.c2_id';
      $params=array();
      $params[]=1;
      $result=$this->db->query($query,$params);
      $result=$result->result_array();
      print_r($result); 
      

      除非您的目标是混淆您的代码,否则我会避免使用 Codeigniter 的 Active Record 类。

      “始终编写代码,就好像最终维护您的代码的人是一个知道您住在哪里的暴力精神病患者一样。”

      【讨论】:

        猜你喜欢
        • 2016-11-21
        • 1970-01-01
        • 2016-11-13
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        相关资源
        最近更新 更多