1

以下のようにネストされたSQLクエリがあります。

SELECT  A.ID, A.fName, A.lName,
   COALESCE (B.calls, 0) AS Calls
FROM TableA AS  A
   LEFT JOIN
   (
      SELECT COUNT(B.event) AS  Calls, B.ID
      FROM TableB AS B
      WHERE B.event LIKE 'call'
        AND `Time` >= 1360540800
        AND `Time` <= 1361232000
      GROUP BY B.ID

    ) B
      ON A.ID = B.ID 
WHERE A.State  LIKE 'SENT' OR A.State  LIKE 'SET'

codeigniter スタイルで変換しようとしています。Code Igniter の Active Record クラスがサブクエリをネイティブにサポートしていないことは知っています。しかし、どうすればこれを行うことができますか。以下のコードを試してみました。そこで、2 つの異なるクエリを作成し、以下のようにユニオンを使用してそれらを結合しました。

$query  = $this->db->query("select * from $subQuery2 UNION $subQuery1  as unionTable ");

ユニオンは正しい方法ではありません。コードイグナイター スタイルに変換するのに役立ちます。

4

1 に答える 1

0

これを行うには、codeigniter のサブクエリの方法を使用できます。これには、codeigniter をハックする必要があります。このように system/database/DB_active_rec.php に移動します これらの関数から public または protected キーワードを削除します

public function _compile_select($select_override = FALSE)
public function _reset_select()

サブクエリの書き込みが利用可能になりましたそして今ここにアクティブなレコードを持つクエリがあります

$data   =   array(
                'COUNT(B.event) AS  Calls',
                'B.ID'
            );

$this->db
        ->select($data)
        ->from('TableB AS B')
        ->like('B.event','call','both')
        ->where('`Time` >=',1360540800)
        ->where('`Time` <=',1361232000)
        ->group_by('B.ID');

$subQuery = $this->db->_compile_select();
$this->db->_reset_select();
unset($data);
$data   =   array(
                'A.ID',
                'A.fName',
                'A.lName',
                'COALESCE (B.calls, 0) AS Calls'
            );
$this->db
        ->select($data)
        ->from('TableA AS A')
        ->join("$subquery")
        ->like('A.State','SENT','both')
        ->or_like('A.State','SET','both');

要件に応じて実行できるように、両方を入れました。注:サブクエリを使用している間は、使用する必要があります

$this->db->from('myTable')

それ以外の

$this->db->get('myTable')

クエリを実行します。

于 2013-03-06T16:22:58.917 に答える