Как суммировать данные из одной таблицы с разными условиями?

Я получил некоторые данные из одного и того же имени таблицы, но с другим условием, и запросил их 3 раза, и в результате получилось:

101=>1
301=>1
501=>2
502=>4
---------------
101=>2
501=>1
---------------
101=>1
501=>1

который первый столбец классы, а второй столбец значения. Каков наилучший способ суммировать эти значения в одном классе, чтобы результат был:

101 = 4
301 = 1
501 = 4
502 = 4

Моя команда запроса:

$query = $db->prepare("SELECT COUNT(std_id) AS total, std_class  FROM attendance WHERE att_mode IN('mode-01','mode-04') AND att_attend='0' AND att_date=CURDATE()  GROUP BY std_class ORDER BY std_class");
$query->execute();
while ($char = $query->fetch(PDO::FETCH_OBJ)) {
$labels2[] = $char->std_class.'-'.$char->total;
$link[] = $char->std_class;
}
$query = $db->prepare("SELECT COUNT(std_id) AS total_sick,std_class FROM attendance WHERE att_mode ='mode-01' AND att_attend='2' AND att_date=CURDATE()  GROUP BY std_class ORDER BY std_class");
$query->execute();
while($char = $query->fetch(PDO::FETCH_OBJ)){
$sickCount[] = $char->std_class.'-'.$char->total_sick;
}
$query = $db->prepare("SELECT COUNT(std_id) AS total_leave,std_class FROM attendance WHERE att_mode ='mode-01' AND att_attend='3' AND att_date=CURDATE()  GROUP BY std_class ORDER BY std_class");
$query->execute();
while($char = $query->fetch(PDO::FETCH_OBJ)){
$leaveCount[] = $char->std_class.'-'.$char->total_leave;
}

1

Решение

Попробуйте этот, используя подзапрос.

"SELECT std_class , COUNT(std_id) as total ,(SELECT COUNT(std_id) AS total_sick FROM attendance WHERE att_mode ='mode-01' AND att_attend='2' AND att_date=CURDATE()  GROUP BY std_class ORDER BY std_class ) AS total_sick    , (SELECT COUNT(std_id) FROM attendance WHERE att_mode ='mode-01' AND att_attend='3' AND att_date=CURDATE()  GROUP BY std_class ORDER BY std_class) AS total_leave FROM attendance WHERE att_mode IN('mode-01','mode-04') AND att_attend='0' AND att_date=CURDATE()  GROUP BY std_class ORDER BY std_class "

Если не работает, дайте мне знать …

0

Другие решения

РЕДАКТИРОВАТЬ: Ответ Priyank, очевидно, лучше, так как это делается с помощью SQL, поэтому никаких накладных расходов PHP.

Я бы взял результат каждого запроса, вставил его в ассоциативный массив и зациклил их. Это будет выглядеть так:

$result = db_query1();
$total = array();
foreach ($result as $classroom => $value) {
$total[$classroom] += $value;
}

$result = db_query2();
foreach ($result as $classroom => $value) {
$total[$classroom] += $value;
}

$result = db_query3();
foreach ($result as $classroom => $value) {
$total[$classroom] += $value;
}

print_r($total);
0

Как уже упоминалось, ответ Приянка должен быть подходящим, но, поскольку перед тем, как увидеть другие ответы, я написал небольшую функцию для вас, я все равно опубликую его, так как он может быть полезен, если вы по какой-либо причине не хотите делать все это в SQL.

function mergeAndSum() {
// get all the given arguments and put them into an array
$arrays = func_get_args();

// create an array that will contain the output
$output = array();

// loop through all the arguments
foreach($arrays as $array) {
// if an argument is not an array it will be skipped
if(!is_array($array)) {
continue;
}
// otherwise it will be iterated
foreach($array as $key => $value) {
// if the key is already in the $output array
if(array_key_exists($key,$output)) {
// add the value to the existing onve for that key
$output[$key] += $value;
} else {
// else store in the $output array the key with it's value
$output[$key] = $value;
}

}

}

return $output;

}

Итак, если у вас есть три массива с результатами запросов

$link = array(
101=>1,
301=>1,
501=>2,
502=>4,
);
$sickCount = array(
101=>2,
501=>1
);
$leaveCount = array(
101=>1,
501=>1
);

вы просто передаете их

$output = mergeAndSum($link,$sickCount,$leaveCount);

и ваш вывод $ будет по желанию

(
101 => 4
301 => 1
501 => 4
502 => 4
)

Учитывая, что способ SQL был бы лучше, эта функция была бы достаточно гибкой, чтобы ее можно было использовать в других подобных случаях, когда у вас есть несколько массивов для объединения и суммирования.

0

Я наконец нашел решение. Вместо того, чтобы делать запрос 3 раза, я запускаю только один запрос.
Рабочий запрос:

$query = $db->prepare("SELECT COUNT(std_id) AS total, std_class FROM attendance WHERE att_mode IN('mode-01','mode-04') AND att_attend IN('0','2','3') AND att_date=CURDATE() GROUP BY std_class ORDER BY std_class");

Предложение WHERE будет соответствовать атрибуту att_mode, который содержит значения «0», «2» и «3». Тогда я получил желаемый результат.
Спасибо за все предыдущие ответы.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector