2016-09-14 86 views
1

请参阅以下查询。将SQL查询转换为codeigniter活动记录

我想转换成CodeIgnitor的活动记录。

SQL查询:

Select MobNo,Caller,Sum(Tot_In_Call) as Tot_In_Call,Called,Sum(Tot_Out_Call) as Tot_Out_Call 
From (

    SELECT CTE.Caller as MobNo,Incall.Caller,Incall.Tot_In_Call, Null as Called,0 as Tot_Out_Call 
    FROM Call_Details CTE 
    Left Join (
      Select Count(Called) as Tot_In_Call,Caller,Called 
      from call_details 
      Group By Caller,Called 
    ) InCall on (Cte.caller = InCall.Called) 
    Where InCall.Called in($call_array) 
    Group BY CTE.Caller,Incall.Caller,Incall.Tot_In_Call 

    Union All 

    SELECT CTE.Caller as MobNo,Null as Caller,Null as Tot_In_Call, OutCall.Called,OutCall.Tot_Out_Call 
    FROM Call_Details CTE 
    Left Join (
      Select Count(Called) as Tot_Out_Call,caller,Called 
      from call_details 
      group by caller,called 
    ) OutCall on (CTE.caller = OutCall.caller And cte.called = OutCall.called) 
    Where CTE.Caller in($call_array) 
    Group BY CTE.Caller,OutCall.Called,OutCall.Tot_Out_Call 

) As Qry 
WHERE Qry.MobNo in($call_array) 
Group By Qry.MobNo,Qry.Caller,Qry.Called 
order by Qry.MobNo,Qry.Caller,Qry.Called 

我如何转换这种不使用$this->db->query()

尝试使用活动记录进行: -

$this->db->select("MobNo,Caller,Sum(Tot_In_Call) as Tot_In_Call,Called,Sum(Tot_Out_Call) as Tot_Out_Call"); 
$this->db->from("SELECT CTE.Caller as MobNo,Incall.Caller,Incall.Tot_In_Call, Null as Called,0 as Tot_Out_Call 
    FROM Call_Details CTE 
    Left Join (
      Select Count(Called) as Tot_In_Call,Caller,Called 
      from call_details 
      Group By Caller,Called 
    ) InCall on (Cte.caller = InCall.Called) 
    Where InCall.Called in($call_array) 
    Group BY CTE.Caller,Incall.Caller,Incall.Tot_In_Call 

    Union All 

    SELECT CTE.Caller as MobNo,Null as Caller,Null as Tot_In_Call, OutCall.Called,OutCall.Tot_Out_Call 
    FROM Call_Details CTE 
    Left Join (
      Select Count(Called) as Tot_Out_Call,caller,Called 
      from call_details 
      group by caller,called 
    ) OutCall on (CTE.caller = OutCall.caller And cte.called = OutCall.called) 
    Where CTE.Caller in($call_array) 
    Group BY CTE.Caller,OutCall.Called,OutCall.Tot_Out_Call"); 
$this->db->where_in("MobNo",$call_array); 
$this->db->group_by("MobNo,Caller,Called"); 
$this->db->order_by("MobNo,Caller,Called","ASC"); 
$this->db->get(); 

预先感谢您很多。

+0

参考https://www.codeigniter.com/userguide2/database/active_record.html – AkshayP

+0

已经引用,但没有使用$ this-> db-> query()找到一个方法,这就是为什么。 ... –

+0

为什么你不想使用$ this-> db-> query() ? – AkshayP

回答

1

如果你真的想这样做,为了让CI逃避你的查询,你应该分裂您的查询。

下面我给你举个例子

$strQuery = $this->db 
    ->select("Count(Called) as Tot_In_Call,Caller,Called", false) 
    ->from("call_details") 
    ->group_by("Caller,Called") 
    ->get_compiled_select(); 

$strQuery = "(".$strQuery.") InCall"; 

$strQuery = $this->db 
    ->select("CTE.Caller as MobNo,Incall.Caller,Incall.Tot_In_Call, Null as Called,0 as Tot_Out_Call", false) 
    ->from("Call_Details CTE") 
    ->join($strQuery,"Cte.caller = InCall.Called","left",false) 
    ->where_in("InCall.Called", $call_array) 
    ->group_by("CTE.Caller,Incall.Caller,Incall.Tot_In_Call") 
    ->get_compiled_select(); 

echo $strQuery; 

上面的查询给你回的第一内选择查询,直到UNION ALL

利用这段代码,你应该能够建立你的查询,并得到你想要什么