如何优化/合并此pdo查询和此计数查询?

时间:2013-09-30 13:48:04

标签: php mysql pdo count

此代码运行良好,但我想知道是否有一种方法可以优化它。

我使用PDO和foreach循环发出请求,并显示存储在数据库中的所有文章。

$allDatasAgenda = $bdd->query('SELECT id, cat_id, text, img FROM site_agenda 
                                WHERE activation = 1 
                                ORDER BY date_publication')->fetchAll(PDO::FETCH_ASSOC);

<?php 
    $i=1; 
    foreach($allDatasAgenda AS $data_agenda): 

        // generate all html

    endforeach; 
    reset($allDatasAgenda); 
 ?>

由于某些原因,我需要知道在数据库中存储了多少篇文章(我需要在最后一篇文章中添加一个类才能使我的next / prev jquery函数正常工作)。

所以,我这样做:

$countArticlesAgenda = $bdd->query('SELECT count(*) FROM site_agenda WHERE activation = 1');
$count_articles_agenda = $countArticlesAgenda->fetchColumn();

我想知道是否有办法只用一个查询获得此结果?

这只是一个优化和美丽的问题。

如果有人可以为我的问题提出更好的标题,那么欢迎你。

2 个答案:

答案 0 :(得分:3)

为了通知您,$allDatasAgenda是数组 为了获得数组元素的数量,PHP有一个叫做的函数 - surprise! - count()

答案 1 :(得分:1)

进行优化:

  • 在数据库上添加索引您至少应该在activation列上有一个索引,但是您需要date_publication上的排序结果,因此{{1}上的索引1}}真的很有用。
  • 避免在html页面上显示数据库的所有内容。如果(activation,date_publication)中的行数超过1000行,会发生什么?计算结果数组是一个很好的技巧,但如果通常程序perfroms计算查询和详细结果查询,那是因为他们在结果查询上使用 LIMIT OFFSET 来对数据进行分页。对数据进行分页意味着避免向用户显示超过50行,还要通过从数据库中检索超过50行来避免浪费时间,内存和带宽(50是一个示例,但是没有人想要在html中读取1000行页)。所以最后你肯定需要一个计数查询来知道你有多少行,你不应该在结果上得到所有这些行。