代码点火器活动记录获取最后 10 条记录并对 ASC 进行排序



我想知道这个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

您必须使用活动记录类的_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();

遗憾的是,在 CI 2.0+ 中,_compile_select()_reset_select() 是受保护的方法。无赖。您必须按照本教程扩展数据库驱动程序,您可以在其中编写如下方法:

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

我想花时间指出,这种行动最好通过加入来服务。您应该考虑更改数据库结构,以便连接是可能的和有效的。

这将起作用,尽管不是活动记录变体。

$this->db->query( "SELECT * FROM (
     SELECT * 
     FROM chat 
     WHERE (userID = ? AND toID = ?) 
     OR (userID = ? AND toID = ?)  
     ORDER BY id DESC
     LIMIT 10
     ) AS `table` ORDER by id ASC", array( $session, $friendID, $friendID, $session) );"

您可以将查询用作:

$this->db->select('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', FALSE); 

最新更新