3

この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
4

3 に答える 3

9

アクティブなレコード クラスの_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()は保護されたメソッドです。残念。次のようなメソッドを記述できる DB ドライバーの拡張については、このチュートリアルに従う必要があります。

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

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

このタイプのアクションは、結合によってより適切に処理されることを指摘したいと思います。結合が可能で効率的になるように、データベース構造を変更することを検討する必要があります。

于 2012-08-08T13:35:38.950 に答える
1

これは機能しますが、アクティブレコードのバリアントではありません。

$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) );"
于 2012-08-08T13:24:41.257 に答える
0

クエリを次のように使用できます。

$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); 
于 2012-08-08T12:58:58.713 に答える