UNION查询与codeigniter的活动logging模式

如何使用PHP CodeIgniter框架的活动logging查询格式进行UNION查询?

CodeIgniter的ActiveRecord不支持UNION,所以你只需编写你的查询并使用ActiveRecord的查询方法。

$this->db->query('SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2'); 

这是我曾经使用的一种快速而肮脏的方法

 // 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); 

不是我最好的工作,但它解决了我的问题。

注意:我不需要命令结果。

通过使用last_query()进行联合,可能会妨碍应用程序的性能。 因为对于单个联合,它需要执行3个查询。 即“n”联合“n + 1”查询。 它不会影响1-2查询联合。 但是,如果联合许多查询或者拥有大量数据的表,它会出现问题。

这个链接会帮助你很多: 活动logging子查询

我们可以将活动logging和手动查询结合起来 例:

 // #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(); 

您可以使用以下方法获取模型中的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语句将在$ subqueryvariables中,而不会实际执行它。

你很久以前就问过这个问题了,所以也许你已经得到了答案。 如果没有,这个过程可能会诀窍。

通过修改somnath huluks的答案,我将这些variables和函数添加到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。

要使用此方法的联合,您只需定期进行活动logging查询,但调用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`) 

我发现这个库很适合我在ActiveRecord风格中添加UNION:

https://github.com/NTICompass/CodeIgniter-Subqueries

但是我必须get_compiled_select() CodeIgniter的dev分支获取get_compiled_select()方法(可在此处获得: https : //github.com/EllisLab/CodeIgniter/blob/develop/system/database/DB_query_builder.php – DB_query_builder将被replaceDB_active_rec)。 推测这种方法将在未来的CodeIgniter生产版本中可用。

一旦我将这种方法添加到系统/数据库中的DB_active_rec.php,它就像一个魅力。 (我不想使用CodeIgniter的开发版本,因为这是一个生产应用程序。)

这是我正在使用的解决scheme:

 $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); 

试试这个

 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(); } 

这是我创build的解决scheme:

 $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);