【问题标题】:Count total sum of rows in while loop计算while循环中的总行数
【发布时间】:2017-03-11 18:44:38
【问题描述】:

好的,我有一个这样的查询

$get_downlines = "SELECT * FROM referrals WHERE ref_upline = :rupline";
$get_downlines = $pdo->prepare($get_downlines);
$get_downlines-> bindValue(':rupline', $sessionid);
$get_downlines-> execute();

while($fetch_downlines = $get_downlines->fetch()){
   $rdownline = $fetch_downlines['ref_downline'];

    $dr = "SELECT * FROM `ads_viewed` WHERE av_user = :user";
    $dr = $pdo->prepare($dr);
    $dr-> bindValue(':user', $rdownline);
    $dr-> execute();
    echo $dr_count = $dr->rowCount();
}

上面的代码给了我3456 的行数(都是单独的计数,如 3、4、5、6)。现在我想在这里总结所有这些行并得到结果为3+4+5+6 = 18。并将其分配给一个全局变量,该变量可以在 while 循环之外的任何地方使用(如果可能的话)。如何做到这一点?

【问题讨论】:

标签: php mysql html pdo


【解决方案1】:

您可以执行以下操作:

$get_downlines = "SELECT * FROM referrals WHERE ref_upline = :rupline";
$get_downlines = $pdo->prepare($get_downlines);
$get_downlines-> bindValue(':rupline', $sessionid);
$get_downlines-> bindValue(':direct', "direct");
$get_downlines-> execute();

$totalrows;

while($fetch_downlines = $get_downlines->fetch()){
   $rdownline = $fetch_downlines['ref_downline'];

    $dr = "SELECT * FROM `ads_viewed` WHERE av_user = :user";
    $dr = $pdo->prepare($dr);
    $dr-> bindValue(':user', $rdownline);
    $dr-> execute();
    echo $dr_count = $dr->rowCount();
    $totalrows+= $dr->rowCount();
}
echo $totalrows;

首先在循环外创建$totalrows; 变量。您可以在 while 循环中使用 $totalrows += $dr->rowCount(); 来根据查询中的行数增加此变量

【讨论】:

  • 我试过了,但忘记在外面呼应了..我的错..感谢您指出.. :)
【解决方案2】:

这可以通过一个查询来完成:

$stmt = $pdo->prepare("
    SELECT COUNT(*) AS cnt
    FROM referrals 
    JOIN ads_viewed ON ads_viewed.av_user = referrals.ref_downline
    WHERE ref_upline = :rupline
");
$stmt->execute(['rupline' => $sessionid]);
$dr_count = $stmt->fetchColumn();

注意:每次在 while-fetch-loop 中执行 SQL 查询时,最好使用 JOIN。而且每次使用SELECT * 只是为了获取行数,都是在浪费资源,应该改用COUNT(*)。

【讨论】:

  • 如果我必须从推荐表中计算单个用户,这很好,但由于这里有多个用户,我需要从每个用户的 ads_viewed 中计算行,我需要在这里使用 while 循环.
  • @ShubhamJha 您在哪里看到,我将其限制为单个用户?你试过了吗?它应该返回与接受的答案相同的结果 - 但代码更少,效率更高。
  • 哦,对不起,我的错..是的,它有效..学到了一些新东西..你能稍微编辑一下你的答案,以便我可以删除反对票吗?
  • @ShubhamJha 我添加了一条注释。
猜你喜欢
  • 2016-06-25
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 2011-09-29
相关资源
最近更新 更多