我应该去一次数据库并获取所有数据或两次并获得我每次需要的数据

时间:2011-01-08 07:14:19

标签: php sql coding-style

我想要一些关于构造一些(基本的)PHP代码的建议。

我需要在不同的地方显示表格中的数据。需要在每个部分中显示的行可以通过标志来标识。

我不确定这样做的最佳方法是进入数据库一次并将数据分成2个变量,因为我循环访问它或者我应该去数据库两次,使用sql只调用我每次都需要的数据。

对于那些想要在代码中看到它的人:

方法A:

// Create and execute a MySQL query
function tasks_not_done(){
        // Open a PDO dtabase connection
        $link = new PDO(DB_INFO, DB_USER, DB_PASS);

        $sql = " SELECT title, created_date
                FROM todos
                WHERE list_id = ? AND checked = '0'
                ORDER BY created_date DESC";
        $stmt = $link->prepare($sql);
        $stmt->execute(array($_REQUEST['list_id']));

        // loop throught all the rows
        while($row = $stmt->fetch()) {
            $date = strtotime($row['created_date']);
            $date = date('d/m/y' , $date);
            echo '<div class="task">' . "\n";
            echo '<span class="taskcdtate">' .$date . '</span>'. '<span class="tasktitle"> ' . $row['title'] . ' </span>' . "\n";
            echo '</div>';

            }
       $stmt->closeCursor();
}

方法B

function tasks_all(){
       // Open a PDO dtabase connection
       $link = new PDO(DB_INFO, DB_USER, DB_PASS);

       $sql = " SELECT title, created_date, checked
                FROM todos
                WHERE list_id = ?
                ORDER BY created_date DESC";
        $stmt = $link->prepare($sql);
        $stmt->execute(array($_REQUEST['list_id']));

        // loop throught all the rows
        $tasks['not_done'] = "";
        $tasks['done'] = "";

        while($row = $stmt->fetch("FETCH_ASSOC")) {
            $date = strtotime($row['created_date']);
            $date = date('d/m/y' , $date);

            if($row['checked'] =='0'){
                $tasks['not_done'] .= '<div class="task">' . "\n";
                $tasks['not_done'] .='<span class="taskcdtate">' .$date . '</span>'. '<span class="tasktitle"> ' . $row['title'] . ' </span>' . "\n";
                $tasks['not_done'] .='</div>';
                } elseif ($row['checked'] =='1') {
                $tasks['done'] .= '<div class="task">' . "\n" .
                $tasks['done'] .='<span class="taskcdtate">' .$date . '</span>'. '<span class="tasktitle"> ' . $row['title'] . ' </span>' . "\n";
                $tasks['done'] .='</div>';
                }

            }
       $stmt->closeCursor();
       return $tasks;
}

感谢

5 个答案:

答案 0 :(得分:4)

这类问题没有正确的答案,但我可以给你一些指示。

我的一般规则是:在您需要时获取所需的数据。但是有很多事情可能会影响到这一点。

  1. 您是否始终使用来自两个查询的数据?如果是,你应该在一个查询中得到所有。如果从不,意味着他们互相排斥,答案就是否定。
  2. 如果您总是需要查询1,有时还需要查询,则需要进行一些考虑。如果包含查询2,查询1会花费更多时间吗?您经常需要查询2,几乎总是或几乎从不。
  3. 如果其他人同时更新数据会发生什么。假设您同时获得两者,并且其他人更新了影响查询2的数据。这意味着您使用的是过时的数据。如果您在需要时获取数据,则可能会获得正确的更新数据。

答案 1 :(得分:1)

方法A是我的选择。

我认为Furnes到目前为止有一些最好的答案,但这里有一些其他的事情需要考虑......

  1. 从我所知道的......你的代码首先并不复杂 - 如果你真的担心这段代码的性能?

  2. 从长远来看,利用他人的代码通常会带来更好的性能,灵活性和可扩展性。减少自己的代码是件好事。如果您选择将工作委托给数据库,那么您可以在其中进行大量优化,这与您依赖自己的代码不同。例如,向您查询的表添加索引可能比选择要采用的编程路径更有意义。

  3. 如果你仍然想知道绝对最有效的方式......为什么不时间/配置代码?使用您自己的数据集,而不是玩理论游戏,查看使用具体指标更快的方法。

答案 2 :(得分:0)

我在这里看不到第二个查询,但您可能会使用JOIN来引入其他数据。

例如,如果我有一张客户表和一张会员卡表,但并非所有客户都有会员卡,我可以这样做:

SELECT c.CustomerID, c.CustomerName, l.LoyaltyCardType, l.LoyaltyCardBalance
FROM Customers c 
     LEFT JOIN LoyaltyCardInformation l 
     ON c.CustomerID = l.CustomerID

对于MySQL,连接语法在这里:http://dev.mysql.com/doc/refman/5.0/en/join.html

答案 3 :(得分:0)

为什么不更优雅地做到:

$sql = " SELECT title, created_date
        FROM todos
        WHERE list_id = ? AND checked = ?
        ORDER BY created_date DESC";
$stmt = $link->prepare($sql);

$stmt->execute(array($_REQUEST['list_id'], '0'));
# do stuff

# and later...
$stmt->execute(array($_REQUEST['list_id'], '1'));

这可以避免代码重复,并且(取决于数据库后端)也应该更快。

答案 4 :(得分:-1)

为什么不这样做?

$sql = " SELECT title, created_date
            FROM todos
            WHERE list_id = ? AND checked = '$filterValue'
            ORDER BY created_date DESC";