Как выполнить запрос UNION с форматом активной записи в формате PHP CodeIgniter?
Запрос UNION с активным шаблоном записи codeigniter
Ответ 1
CodeIgniter ActiveRecord не поддерживает UNION, поэтому вы просто напишете свой запрос и используете метод запроса ActiveRecord.
$this->db->query('SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2');
Ответ 2
Это быстрый и грязный метод, который я когда-то использовал
// Query #1
$this->db->select('title, content, date');
$this->db->from('mytable1');
$query1 = $this->db->get()->result();
// Query #2
$this->db->select('title, content, date');
$this->db->from('mytable2');
$query2 = $this->db->get()->result();
// Merge both query results
$query = array_merge($query1, $query2);
Не моя лучшая работа, но она решила мою проблему.
Примечание: мне не нужно было заказывать результат.
Ответ 3
Выполняя объединение, используя last_query(), это может помешать работе приложения. Поскольку для единого объединения потребуется выполнить 3 запроса. т.е. для "n" объединения "n + 1" запросов. Это не повлияет на 1-2 запроса. Но это даст проблему, если объединение многих запросов или таблиц с большими данными.
Эта ссылка вам очень поможет: активные подзапросы записей
Мы можем комбинировать активную запись с ручными запросами. Пример:
// #1 SubQueries no.1 -------------------------------------------
$this->db->select('title, content, date');
$this->db->from('mytable');
$query = $this->db->get();
$subQuery1 = $this->db->_compile_select();
$this->db->_reset_select();
// #2 SubQueries no.2 -------------------------------------------
$this->db->select('title, content, date');
$this->db->from('mytable2');
$query = $this->db->get();
$subQuery2 = $this->db->_compile_select();
$this->db->_reset_select();
// #3 Union with Simple Manual Queries --------------------------
$this->db->query("select * from ($subQuery1 UNION $subQuery2) as unionTable");
// #3 (alternative) Union with another Active Record ------------
$this->db->from("($subQuery1 UNION $subQuery2)");
$this->db->get();
Ответ 4
Вы можете использовать следующий метод, чтобы получить инструкцию SQL в модели:
$this->db->select('DISTINCT(user_id)');
$this->db->from('users_master');
$this->db->where('role_id', '1');
$subquery = $this->db->_compile_select();
$this->db->_reset_select();
Таким образом, оператор SQL будет находиться в переменной $subquery без фактического выполнения.
Вы задали этот вопрос давным-давно, так что, возможно, у вас уже есть ответ. если нет, этот процесс может сделать трюк.
Ответ 5
путем изменения ответа somnath huluks, я добавляю следующие переменные и функции в класс DB_Active_rec следующим образом:
class DB_Active_records extends CI_DB_Driver
{
....
var $unions;
....
public function union_push($table = '')
{
if ($table != '')
{
$this->_track_aliases($table);
$this->from($table);
}
$sql = $this->_compile_select();
array_push($this->unions, $sql);
$this->_reset_select();
}
public function union_flush()
{
$this->unions = array();
}
public function union()
{
$sql = '('.implode(') union (', $this->unions).')';
$result = $this->query($sql);
$this->union_flush();
return $result;
}
public function union_all()
{
$sql = '('.implode(') union all (', $this->unions).')';
$result = $this->query($sql);
$this->union_flush();
return $result;
}
}
поэтому вы можете практически использовать союзы без зависимостей от db_driver.
чтобы использовать соединение с этим методом, вы просто делаете регулярные активные запросы записи, но вызываете union_push вместо get.
Примечание: вы должны убедиться, что ваши запросы имеют соответствующие столбцы, например, обычные союзы
Пример:
$this->db->select('l.tpid, l.lesson, l.lesson_type, l.content, l.file');
$this->db->where(array('l.requirement' => 0));
$this->db->union_push('lessons l');
$this->db->select('l.tpid, l.lesson, l.lesson_type, l.content, l.file');
$this->db->from('lessons l');
$this->db->join('scores s', 'l.requirement = s.lid');
$this->db->union_push();
$query = $this->db->union_all();
return $query->result_array();
создаст:
(SELECT `l`.`tpid`, `l`.`lesson`, `l`.`lesson_type`, `l`.`content`, `l`.`file`
FROM `lessons` l
WHERE `l`.`requirement`=0)
union all
(SELECT `l`.`tpid`, `l`.`lesson`, `l`.`lesson_type`, `l`.`content`, `l`.`file`
FROM `lessons` l
JOIN `scores` s ON `l`.`requirement`=`s`.`lid`)
Ответ 6
Я нашел эту библиотеку, которая отлично работала для меня, чтобы добавить UNION в стиле ActiveRecord:
https://github.com/NTICompass/CodeIgniter-Subqueries
НО мне пришлось сначала взять метод get_compiled_select()
из ветки dev CodeIgniter (доступно здесь: https://github.com/EllisLab/CodeIgniter/blob/develop/system/database/DB_query_builder.php - DB_query_builder будет заменить DB_active_rec). Предположительно, этот метод будет доступен в будущей производственной версии CodeIgniter.
Как только я добавил этот метод к DB_active_rec.php в системе/базе данных, он работал как шарм. (Я не хотел использовать dev-версию CodeIgniter, поскольку это производственное приложение.)
Ответ 7
попробуйте этот
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();
}
Ответ 8
Это решение, которое я использую:
$union_queries = array();
$tables = array('table1','table2'); //As much as you need
foreach($tables as $table){
$this->db->select(" {$table}.row1,
{$table}.row2,
{$table}.row3");
$this->db->from($table);
//I have additional join too (removed from this example)
$this->db->where('row4',1);
$union_queries[] = $this->db->get_compiled_select();
}
$union_query = join(' UNION ALL ',$union_queries); // I use UNION ALL
$union_query .= " ORDER BY row1 DESC LIMIT 0,10";
$query = $this->db->query($union_query);
Ответ 9
Вот решение, которое я создал:
$query1 = $this->db->get('Example_Table1');
$join1 = $this->db->last_query();
$query2 = $this->db->get('Example_Table2');
$join2 = $this->db->last_query();
$union_query = $this->db->query($join1.' UNION '.$join2.' ORDER BY column1,column2);