【问题标题】:How can I improve the following mysql selects?如何改进以下 mysql 选择?
【发布时间】:2013-06-23 17:21:45
【问题描述】:

我目前正在重构一个遗留应用程序并逐步转换为 zend 框架 1.12。

我正在为如何将其转换为 zend db 而摸不着头脑,有没有一种方法可以在一个查询中完成?

现在我看到它首先获取文件夹列表,然后对每个文件夹运行一个附加查询... 将其作为一个查询运行会提高性能,对吗?

$folders_query = DB::Query("select * from contacts_folders order by sort_order, name");
while($folders = DB::FetchArray($folders_query)){
    $counts_total = DB::QueryOne("SELECT count(cm.messages_id) AS total
    FROM contacts_basics cb, contacts_messages cm
    WHERE cb.contacts_id = cm.contacts_id
    AND cm.folders_id =  '" . $folders['folders_id'] . "'
    AND cm.status = '1'
    AND cm.mark =  '0'");


    if ($counts_total >0){ 
        $folders_name = '<strong>' . $folders['name'] . ' (' . $counts_total . ')</strong>'; 
    } else { 
        $folders_name = $folders['name']; 
    }

    echo '<li><a href="messages.php?fID=' . $folders['folders_id'] . '">';

    echo $folders_name;

    echo '</a></li>';
}

【问题讨论】:

    标签: php mysql zend-db zend-db-select


    【解决方案1】:

    是的,您可以在同一个查询中同时执行这两项操作

    SELECT cf.*, count(cm.messages_id) AS total
    FROM contacts_folders cf left outer join
         contacts_messages cm
         on cf.id = cm.folders_id and
            cm.status = '1' AND cm.mark =  '0' left outer join
         contacts_basics cb
         on cb.contacts_id = cm.contacts_id
    group by cf.folders_id
    order by cf.sort_order, cf.name;
    

    这使用left outer join 来确保您获得所有文件夹,即使没有消息也是如此(原始代码的工作方式)。由于left outer join,需要将条件移入on 子句中。

    它还从文件夹中获取所有信息以及总数。如果没有消息,则该文件夹应返回 0。

    【讨论】:

      【解决方案2】:

      戈登的回答中有一个小错误,但多亏了他,我才弄明白。

      我变了

      contacts_basics cb left outer join
      

      收件人:

      left outer join contacts_basics cb
      

      以下代码按预期工作:

      public function getMenuCounts(){
          $raw = "SELECT cf.*, count(cm.messages_id) AS total
          FROM contacts_folders cf left outer join
          contacts_messages cm
          on cf.folders_id = cm.folders_id and
          cm.status = '1' AND cm.mark =  '0'
          left outer join contacts_basics cb
          on cb.contacts_id = cm.contacts_id
          group by cf.folders_id
          order by cf.sort_order, cf.name;";
          $db = Zend_Db_Table::getDefaultAdapter();
          $stmt = $db->query($raw);
          return $stmt->fetchAll();
      }
      

      【讨论】:

      • 。 .有趣。那是因为我最初是按照您在原始查询中的顺序编写连接的。然后我意识到具有正确连接字段的表是cm,而不是cb。一种解决方案是right outer join,但我更喜欢left outer join(习惯),我想我没有完全修复语法。
      猜你喜欢
      • 1970-01-01
      • 2021-01-12
      • 2018-07-30
      • 2021-06-02
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多