#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
должно быть вне цикла, поэтому у вас есть 60
секунд.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