2017-08-16 62 views
1

予取一些数据从相同的表名,但具有不同的条件,余查询它的3倍,其结果是:如何从不同条件的相同表中求和数据?

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

其中第一列是教室和第2栏是值。什么是同一个教室,总结这些价值的最佳方式,因此结果将是:

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; 
    } 

回答

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"); 

“何处” 子句将满足 “att_mode” 包含的 '0', '2' 值,和 '3'。然后我得到了预期的结果。 感谢所有以前的答案。

0

使用子查询试试这一个。

"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

我得到这个错误:SQLSTATE [21000]:基数冲突:1242子查询返回多于1行 – Wasinha

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

如前所述,Priyank的答案应该是要走的路,但因为看到其他的答案之前,我写了一个小功能,为你无论如何,我会发布它,因为它可能是如果你不想因为任何原因在SQL中执行所有操作,这将非常有用。

​​

因此,假设你有你三个阵列查询

$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方式会更好,此功能将足够灵活,可用于其他类似情况下,其中有一些阵列合并并总结

相关问题