【问题标题】:MySQL Query Statement converted to Codeigniter Active record style query statement with SUM()使用 SUM() 将 MySQL 查询语句转换为 Codeigniter 活动记录样式查询语句
【发布时间】:2012-10-22 18:03:01
【问题描述】:

我正在尝试找出转换此 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 活动记录格式的东西。 EG

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

标准的 mysql 语句可以正常工作。但是以坚持统一的名义,我想使用活动记录。有什么办法吗?我找不到 SUM() 的任何内容

【问题讨论】:

  • 我在指南中上下搜索了类似的内容,但找不到。但是我仍然有一点障碍,因为它没有出现(基于我现在找到的指南)我可以多次使用select_sum,如果可以的话?我如何像上面提到的SUM() 一样考虑各种条件?

标签: php mysql codeigniter activerecord


【解决方案1】:
      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"

【讨论】:

    【解决方案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
    

    此外,如果您可以通过sayign 接受来简化,使yes,no,也许都是排他性的,那么您也可以去掉“decidedwhen”以进一步简化。 (理想情况下,您只需要一个“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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多