2

如何以 Codeigniter 样式编写以下查询。

SELECT COUNT(`id`) AS reccount
  FROM 
    (SELECT `id` FROM table1 
     WHERE tid= '101' AND `status` =  1
     UNION ALL
    SELECT `id` FROM table2 
     WHERE tid= '101' AND `status` =  1
     UNION ALL
    SELECT `id` FROM table3
     WHERE tid= '101' AND `status` =  1) t

我使用了以下方式来执行它。

这是唯一正确的方法还是您有任何改进的建议?

 $q = $this->db->query(SELECT COUNT(`id`) AS reccount
                        FROM 
                        (SELECT `id` FROM table1 
                         WHERE tid= '101' AND `status` =  1
                         UNION ALL
                         SELECT `id` FROM table2 
                         WHERE tid= '101' AND `status` =  1
                         UNION ALL
                         SELECT `id` FROM table3
                         WHERE tid= '101' AND `status` =  1) t ");
4

3 回答 3

19

从 CodeIgniter 3 开始,它在 Active Record 中被引入了在get_compiled_select()不实际执行查询的情况下提供查询字符串的函数。

这允许@MDeSilva 方法使用更少的资源,调整如下:

function get_merged_result($ids){                   
    $this->db->select("column");
    $this->db->distinct();
    $this->db->from("table_name");
    $this->db->where_in("id",$model_ids);
    $query1 = $this->db->get_compiled_select(); // It resets the query just like a get()

    $this->db->select("column2 as column");
    $this->db->distinct();
    $this->db->from("table_name");
    $this->db->where_in("id",$model_ids);
    $query2 = $this->db->get_compiled_select(); 

    $query = $this->db->query($query1." UNION ".$query2);

    return $query->result();
}
于 2016-03-06T21:38:16.697 回答
1

您可以使用 CI 生成联合查询。但是,最新版本使这比以前困难得多。

DB 有一个名为 _compile_select 的方法,在以前的 CI 版本中它是公开的,但现在它受到保护,因此您不能只$this->db->_compile_select()从控制器调用。为了正确地做到这一点,可以:

  1. 创建自定义加载器类以能够扩展核心/数据库类(即加载MY_DB_active_record而不是CI_DB_active_record)。
  2. 创建自定义活动记录类,只需一种方法:

    public function compile_select() {
        return $this->_compile_select();
    }
    
  3. 在您的控制器中,创建所有必要的查询,使用我们的公共方法将它们编译成字符串数组compile_select()

  4. 将数组加入单个查询:'(' . implode(') UNION (', $queries) . ')'. 您还可以将其包装到自定义 AR 类中的单独方法中。
于 2015-03-09T21:47:14.583 回答
-2
function get_merged_result($ids){                   
    $this->db->select("column");
    $this->db->distinct();
    $this->db->from("table_name");
    $this->db->where_in("id",$model_ids);
    $this->db->get(); 
    $query1 = $this->db->last_query();

    $this->db->select("column2 as column");
    $this->db->distinct();
    $this->db->from("table_name");
    $this->db->where_in("id",$model_ids);

    $this->db->get(); 
    $query2 =  $this->db->last_query();
    $query = $this->db->query($query1." UNION ".$query2);

    return $query->result();
}
于 2013-02-20T11:27:21.900 回答