2017-08-16 58 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方式會更好,此功能將足夠靈活,可用於其他類似情況下,其中有一些陣列合併並總結

相關問題