2010-04-22 11 views
5
$activeQuery = mysql_query("SELECT count(`status`) AS `active` FROM `assignments` WHERE `user` = $user_id AND `status` = 0"); 
$active = mysql_fetch_assoc($activeQuery); 

$failedQuery = mysql_query("SELECT count(`status`) AS `failed` FROM `assignments` WHERE `user` = $user_id AND `status` = 1"); 
$failed = mysql_fetch_assoc($failedQuery); 

$completedQuery = mysql_query("SELECT count(`status`) AS `completed` FROM `assignments` WHERE `user` = $user_id AND `status` = 2"); 
$completed = mysql_fetch_assoc($completedQuery); 

必須有更好的方法來做到這一點,對吧?我不知道我有多少需要詳細說明,因爲您可以看到我想要做的事情,但有什麼辦法可以在一個查詢中完成所有這些工作?我需要能夠輸出活動,失敗和完成的任務,最好在一個查詢中輸出。MySQL - 如何更好地做到這一點?

+3

*(參考)* HTTP:// EN。 wikipedia.org/wiki/SQL_injection – Gordon 2010-04-22 16:39:50

+2

雖然我沒有接受任何用戶輸入。 – Andrew 2010-04-22 16:42:04

+2

取決於您獲取$ user_id的方式。它不是直接來自cookie,是嗎? – Tom 2010-04-22 16:49:43

回答

10

添加組你可以嘗試這樣的查詢事而不是做他們的

SELECT Status , COUNT(*) StatusCount 
FROM assignments 
WHERE Status IN (0, 1, 2) 
AND User = $user_id 
GROUP BY Status 
+1

不要忘記$ user_id – kenwarner 2010-04-22 16:41:42

+1

+1這比我的解決方案更好,它只選擇您在問題中陳述的3個狀態。我曾以爲只有3 – hookedonwinter 2010-04-22 16:43:54

+1

這很好。不知道如何,但它確實如此。 >。> – Andrew 2010-04-22 16:52:55

2

試試這個

$activeQuery = SELECT status, count(status) as "status count" FROM `assignments` WHERE `user` = $user_id GROUP BY `status` 

編輯:由

0

單獨您可以使用下面的單個SQL語句

SELECT count(*), `status` 
FROM `assignments` 
WHERE `user` = $user_id 
    AND `status` in (0,1,2) 
GROUP BY `status` 
ORDER BY `status` 

圍繞結果集的循環提取結果。

0

使用GROUP BY在一個查詢中得到它,但在單獨的行中。

$query = mysql_query("SELECT `status`, count(*) AS `num` FROM `assignments` WHERE `user` = $user_id AND `status` in (0,1,2) GROUP BY `status` ORDER BY `status` ASC"); 
$active_count = 0; 
$failed_count = 0; 
$completed_count = 0; 
while ($array = mysql_fetch_assoc($query)) 
{ 
    if ($array['status'] == 0) 
     $active_count = $array['num']; 
    else if ($array['status'] == 1) 
     $failed_count = $array['num']; 
    else if ($array['status'] == 2) 
     $completed_count = $array['num']; 
} 
+1

這不起作用。例如,如果沒有status = 1記錄,那麼failed_count將獲得status = 2值,並且completed_count(取決於error_report設置)或者爲null或導致錯誤,因爲從mysql_fetch_assoc返回的$ completed_array將是布爾值false,而不是數組。 – jmucchiello 2010-04-22 16:54:17

+0

好點 - 這就是我匆忙回答的問題。這個新版本怎麼樣? – Dathan 2010-04-22 17:14:26

0
SELECT 
(SELECT COUNT(*) FROM `assignments` WHERE `user` = $user_id AND `status` = 0) AS active, 
(SELECT COUNT(*) FROM `assignments` WHERE `user` = $user_id AND `status` = 1) AS failed, 
(SELECT COUNT(*) FROM `assignments` WHERE `user` = $user_id AND `status` = 2) AS completed, 
FROM `assignments` 
GROUP BY active, failed, completed 

還沒有檢查標記,但這是接近或足夠近。

0

當我有選擇時,我習慣於使用準備好的語句來幫助防止SQL注入保護和效率(requires using mysqli)

但是,如果這不是一個選項,然後

SELECT 
    CASE `status` 
     WHEN 0 THEN `active` 
     WHEN 1 THEN `failed` 
     WHEN 2 THEN `completed` 
     ELSE `unknown` 
    END 
    AS `statuslabel`, 
    COUNT(status) 
    AS `statuscount` 
FROM `assignments` 
WHERE `user` = $escaped_user_id 
GROUP BY `statuslabel` 
ORDER BY `statuslabel` 

注意使用$escaped_user_id,這將提前創建:

$escaped_user_id = mysql_real_escape_string($user_id); 
相關問題