codeigniter活动记录获取最后10条记录并对ASC进行排序

Oli*_*ado 2 activerecord codeigniter

我想知道这个SQL语句是否在Codeigniter活动记录中完成.

SELECT * FROM (
SELECT * 
FROM chat 
WHERE (userID = $session AND toID = $friendID) 
OR (userID = $friendID AND toID = $session)  
ORDER BY id DESC
LIMIT 10
) AS `table` ORDER by id ASC
Run Code Online (Sandbox Code Playgroud)

Bre*_*dan 7

您必须使用活动记录类的_compile_select()_reset_select()方法.

$this->db->select('*');
$this->db->from('chat');
$this->db->where("(userID='{$session}' AND toID='{$friendID}')");
$this->db->or_where("(userID='{$friendID}' AND toID='{$session}')");
$this->db->order_by('id', 'DESC');
$this->db->limit('10');

$subQuery = $this->db->_compile_select();

$this->db->_reset_select();

$this->db->select('*');
$this->db->from("{$subQuery} AS table");
$this->db->order_by('id', 'ASC');

$query = $this->db->get();
Run Code Online (Sandbox Code Playgroud)

不幸的是,在CI 2.0+中,_compile_select()并且_reset_select()是受保护的方法.游民.您必须按照本教程扩展DB驱动程序,您可以在其中编写如下方法:

function get_compiled_select()
{
    return $this->db->_compile_select();
}

function do_reset_select()
{
    $this->db->_reset_select();
}
Run Code Online (Sandbox Code Playgroud)

我想花点时间指出,这种类型的行动会更好地通过联接来实现.您应该考虑更改数据库结构,以便可以高效地进行连接.