2012-11-02 57 views
0

我試着去找出該MySQL查詢語句轉換成笨的Active Record風格查詢語句用SUM()

SELECT 
     SUM(invite.friendID = $mID AND invite.decidedwhen = '0000-00-00 00:00:00' AND evnt.ends >= '$event_ts' and invite.isactive = 0 and evnt.isactive = 0) AS invites_undecided, 
     SUM(invite.friendID = $mID AND invite.decidedwhen != '0000-00-00 00:00:00' AND invite.yes = 1 AND evnt.ends >= '$event_ts' and invite.isactive = 0) and evnt.isactive = 0 AS invites_yes, 
     SUM(invite.friendID = $mID AND invite.decidedwhen != '0000-00-00 00:00:00' AND invite.no = 1 AND evnt.ends >= '$event_ts' and invite.isactive = 0 and evnt.isactive = 0) AS invites_no, 
     SUM(invite.friendID = $mID AND invite.decidedwhen != '0000-00-00 00:00:00' AND invite.maybe = 1 AND evnt.ends >= '$event_ts' and invite.isactive = 0 and evnt.isactive = 0) AS invites_maybe 
FROM user_event_invite AS invite 
JOIN user_event AS evnt ON evnt.eID = invite.eID 

轉換這個MySQL查詢使用Codeigniters活動記錄格式的東西的最佳方式。 EG

$this->db->select() 
    ->from('user_event') 
    ->... something? 

標準mysql語句工作得很好。但是爲了堅持統一我想使用活動記錄的一切。任何這樣做? (因爲我沒有測試它比回答的評論,但它仍可能幫助)我找不到SUM()

+0

$這個 - > DB-> select_sum(..)? – Mate

+0

我搜索了上下類似的東西,找不到它。然而,我仍然處於一個障礙之中,因爲它沒有出現(基於現在的指導我發現它),我可以多次使用'select_sum',並且如果可以的話?我如何在每個SUM()的條件中考慮因素,就像我上面所說的那樣? – chris

回答

2

什麼

沒有爲活動記錄一個$this->db->select_sum();功能,(這是我不確定的一點),你可能可以連接方法。所以這裏有一些東西可以嘗試。

第一階段是去掉常見的東西到WHERE。如果WHERE索引,它會加快速度。這會給你(與parenthasis定得 - 你的SQL有錯誤)

SELECT 
    SUM(invite.decidedwhen = '0000-00-00 00:00:00') AS invites_undecided, 
    SUM(invite.decidedwhen != '0000-00-00 00:00:00' AND invite.yes = 1) AS invites_yes, 
    SUM(invite.decidedwhen != '0000-00-00 00:00:00' AND invite.no = 1) AS invites_no, 
    SUM(invite.decidedwhen != '0000-00-00 00:00:00' AND invite.maybe = 1) AS invites_maybe 
FROM user_event_invite AS invite 
    JOIN user_event AS evnt ON evnt.eID = invite.eID 
WHERE invite.friendID = $mID AND evnt.ends >= '$event_ts' and invite.isactive = 0 AND evnt.isactive = 0 

此外,如果你可以通過sayign接受,從而是的,簡化不,也許都是獨家那麼你可以脫光「決定什麼時候「以及進一步簡化。 (理想情況下,你只需要一個「COUNT」並減去其餘部分,但不清楚如何在活動記錄的一個查詢中執行此操作)。

SELECT 
    SUM(invite.decidedwhen = '0000-00-00 00:00:00') AS invitees_undecided, 
    SUM(invite.yes = 1) AS invites_yes, 
    SUM(invite.no = 1) AS invites_no, 
    SUM(invite.maybe = 1) AS invites_maybe 
FROM user_event_invite AS invite 
    JOIN user_event AS evnt ON evnt.eID = invite.eID 
WHERE invite.friendID = $mID AND evnt.ends >= '$event_ts' AND invite.isactive = 0 AND evnt.isactive = 0 

現在用它來法鏈上的活動記錄:

$this->db->select_sum('invite.decidedwhen = '0000-00-00 00:00:00', 'invite_undecided') 
    ->select_sum('yes', 'invite_yes') 
    ->select_sum('no', 'invite_no') 
    ->etc 
    ->from('user_event_invite') 
    ->join('user_event', 'user_event.eID=user_event_invite.eID) 
    ->where('friendID', '$mID') 
    ->where('user_event.ends >=', $event_ts) 
    -> etc 
0
 Like that you can write query : 
    ================================== 
    $query="SELECT SUM(case when invite.friendID = " . $mID ." AND 
    invite.decidedwhen = '0000-00-00 00:00:00' AND evnt.ends >= '" . $event_ts . "' 
    and invite.isactive = 0 and evnt.isactive = 0) AS invites_undecided,...  
    FROM user_event_invite AS invite 
     left outer JOIN user_event AS evnt ON evnt.eID = invite.eID"