I have to merge two different tables that contain two types of post into one table with all posts. I've tried using UNION ALL and I get good results until I have to add pagination.
$this->db->select("id,article_type,title,main_img1,open_date");
$this->db->from('table1');
$query1 = $this->db->get_compiled_select();
$this->db->reset_query();
$this->db->select("id,article_type,title,main_img1,open_date");
$this->db->from('table2');
$query2 = $this->db->get_compiled_select();
$this->db->reset_query();
$articles = $this->db->query($query1 . ' UNION ALL ' . $query2);
$data['total_rows'] = $articles->num_rows();
/*pagination*/
$page = $this->input->get('page') ? $this->input->get('page') : 1;
$this->load->library("pagination");
$this->config->load('pagination', true);
$config = $this->config->item('pagination');
$config['reuse_query_string'] = TRUE;
$config['query_string_segment'] = 'page';
$config["base_url"] = site_url('example/index');
$config["total_rows"] = $data['total_rows'];
$config["per_page"] = 9;
$config["offset"] = ($page - 1) * $config["per_page"];
$this->pagination->initialize($config);
$data['column_pagination'] = $this->pagination->create_links();
/* get records */
$query = $this->db->query($articles . 'ORDER BY open_date DESC, id DESC LIMIT ' . $config["offset"] . ',' . $config["per_page"]);
$data['article_posts'] = $query->result_array();
I'm using the existing code and it seems that a unified table doesn't go well with ORDER BY and LIMIT. Does anybody have a solution??
UPDATE: I have a query2 on my original code! sorry for the typo.
CodePudding user response:
You used the wrong variable, change
$query = $this->db->query($articles . 'ORDER BY open_date DESC, id DESC LIMIT ' . $config["offset"] . ',' . $config["per_page"]);
To
$query = $this->db->query($query1 . ' UNION ALL ' . $query2 . ' ORDER BY open_date DESC, id DESC LIMIT ' . $config["offset"] . ',' . $config["per_page"]);
Because Articles is not a String, it's a database object. You are also going to need a space before ORDER BY as the original query doesn't contain the space.
If you really want to be dynamic
$query = $this->db->query($this->db->last_query() . ' ORDER BY open_date DESC, id DESC LIMIT ' . $config["offset"] . ',' . $config["per_page"]);
BTW you know you don't have a $query2?