0

このmysqlクエリを変換する最良の方法を見つけようとしています

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

Codeigniters アクティブ レコード フォーマットを使用するものに。例えば

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

標準の mysql ステートメントは問題なく機能します。でも、何にでもこだわるという名目で現役のレコードを使いたい。これを行う方法はありますか?何も見つからないSUM()

4

2 に答える 2

2

(私はそれをテストしていないので、答えよりもコメントのほうが多いですが、それでも役立つかもしれません)

アクティブ レコード用の関数があり$this->db->select_sum();、(これはちょっとわかりませんが) おそらくメソッド チェーンを実行できます。そこで、試してみたいことがあります。

ステージ 1 は、一般的なものを WHERE に取り除くことです。WHERE がインデックス化されている場合は、速度が向上します。これにより、(括弧も修正されます-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

また、「はい」、「いいえ」、「たぶん」をすべて排他的にすることで単純化できる場合は、さらに単純化するために「決定したとき」を削除することもできます。(理想的には、「COUNT」だけにして残りを減算しますが、アクティブなレコードに対する1つのクエリでそれを行う方法は明確ではありません).

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
于 2012-11-02T04:29:11.980 に答える
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"
于 2012-11-02T04:24:25.227 に答える