Я получил некоторые данные из одного и того же имени таблицы, но с другим условием, и запросил их 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;
}
Попробуйте этот, используя подзапрос.
"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 "
Если не работает, дайте мне знать …
РЕДАКТИРОВАТЬ: Ответ 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);
Как уже упоминалось, ответ Приянка должен быть подходящим, но, поскольку перед тем, как увидеть другие ответы, я написал небольшую функцию для вас, я все равно опубликую его, так как он может быть полезен, если вы по какой-либо причине не хотите делать все это в 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 был бы лучше, эта функция была бы достаточно гибкой, чтобы ее можно было использовать в других подобных случаях, когда у вас есть несколько массивов для объединения и суммирования.
Я наконец нашел решение. Вместо того, чтобы делать запрос 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». Тогда я получил желаемый результат.
Спасибо за все предыдущие ответы.