Добавление итогов из операторов sql, использующих объединение

#php #mysql #sql #count #union

#php #mysql #sql #подсчет #объединение

Вопрос:

У меня есть запрос, который использует объединение для отображения итогов из каждой категории запросов. Я пытаюсь найти способ добавить итоги по всем 6 категориям и показать их на странице пользователя. Я использую ajax для перезагрузки итогов по мере их поступления или завершения. То, что я получаю в ответ, показывает каждую категорию последовательно, а не общее количество.

 $sql = "SELECT 'SKU Requests: ' AS skus, COUNT(*), '/admin/sku2', '/skuRequest/myRequests.php' AS sLink FROM sku_request WHERE completed = 0
        UNION
        SELECT 'Sku Update:' AS updates, COUNT(*), '/admin/sku/skuUpdate.php', '#' AS sLink FROM sku_update WHERE completed = 0
        UNION
        SELECT 'RMA Requests: ' AS rma, COUNT(*),'/admin/rma', '/rma/yourRequests.php' AS sLink FROM rma_submissions WHERE rma_number = 'Pending'
        UNION
        SELECT 'Termination Requests: ' AS idT, COUNT(*),'/admin/idTerminations','/idTermination/yourIdTermRequests.php' AS sLink FROM idTermination WHERE completed = 0
        UNION
        SELECT 'ID Requests: ' AS ids, COUNT(*), '/admin/idRequest2', '/idRequest/yourIdRequests.php' AS sLink FROM id_request WHERE ssoid IS NULL
        UNION
        SELECT 'TDA: ' AS tda, COUNT(*), '/admin/tda', '/tda' AS sLink FROM tda_request WHERE completed = 0


";


  $stmt = $conn->prepare($sql);

  $stmt->bindColumn(1,$ID);
  $stmt->bindColumn(2,$count);
  $stmt->bindColumn(3,$link);
  $stmt->bindColumn(4,$link2);
  $stmt->execute();
  $numRows = $stmt->rowCount();

  if (isset($numRows)) {

}

while ($stmt->fetch()) {

  $reqTotals = $count;
  echo $reqTotals;

}
 

результат echo является 000000 пустым. Если поступает запрос, скажем, на завершение идентификатора, он показывает 000110 , когда он должен показывать только 1. Отображается запрос на TDA 000001 .

Как я могу заставить их сложить? Я пытался использовать = , но это, похоже, не работает. Что странно, если я помещаю результат в сеанс, он работает нормально.

Это работает и показывает правильные числа. Но мне не нравится использовать это в сеансе.

 while ($stmt->fetch()) {

  if($count > 0){
    $class = "badge badge-pill badge-danger";
  }else{$class = "badge badge-pill badge-success";}

if($_SESSION['role'] == 'Admin'){
  echo '<div class="btn-group floatRight" role="group" style="font-size: 14px;"><a href="'.$link.'" class="nav-link" style="margin-left: -20px;"> '.$ID.' <span class="'.$class.'" style="margin-left: 4px; margin-right: -6px;"> ' . $count . '</span></a></div>';
  if ($count == 0) {
    $_SESSION['re_totals'] = 0;
  }
  $_SESSION['re_totals'] = $count;
}else{
  echo '<div class="btn-group floatRight" role="group"><a href="'.$link2.'" class="nav-link" style="margin-left: -20px;"> '.$ID.' <span class="'.$class.'" style="margin-left: 4px;"> ' . $count . '</span></a></div>';
  if ($count == 0) {
    $_SESSION['re_totals'] = 0;
  }
  $_SESSION['re_totals'] = $count;
}


}
 
 Current result:
     Request Totals: 000000
Desired Results:
     Request Totals: 0 or 1, 2, 3 etc.
 

Комментарии:

1. echo $reqTotals должно быть вне цикла, поэтому у вас есть 6 0 секунд. var_dump($count) что возвращает?

2. @user3783243 да, я думал об этом, но это возвращает 0. Я изменил where с 0 => 1, чтобы показать результаты

3. Я раньше не использовал bindColumn . Если вы прокомментируете это и используете while ($row = $stmt->fetch()) { print_r($row); , что у вас есть? rowcounts Также может не делать то, что вы хотите, но при if (isset($numRows)) { бездействии это не имеет значения.

Ответ №1:

То, что я получаю в ответ, показывает каждую категорию последовательно, а не общее количество.

Почему бы просто не выполнить вычисления в базе данных?

 SELECT 
    (SELECT COUNT(*) AS cnt FROM sku_request WHERE completed = 0)
      (SELECT COUNT(*) FROM sku_update WHERE completed = 0)
      (SELECT COUNT(*) FROM rma_submissions WHERE rma_number = 'Pending')
      (SELECT COUNT(*) FROM idTermination WHERE completed = 0)
      (SELECT COUNT(*) FROM id_request WHERE ssoid IS NULL)
      (SELECT COUNT(*) FROM tda_request WHERE completed = 0)
    AS res