SQL Query转换为codeigniter活动记录

时间:2016-09-14 10:14:06

标签: php mysql codeigniter

请参阅以下查询。

我想转换为CodeIgnitor Active Records。

SQL QUERY:

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();

提前多多谢谢你。

1 个答案:

答案 0 :(得分: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

使用这段代码,您应该能够构建查询并获得所需内容