2011-08-27 57 views
3

嘿這裏是SQL語句我使用MySQL SELECT列COUNT(name)WHERE條件GROUP BY列?

$sql = "SELECT number, COUNT(name) FROM people WHERE id='$id' GROUP BY number"; 
$result = mysql_query($sql); 

while($row = mysql_fetch_array($result)){ 
$statarray['stat'.$i] = $row['COUNT(name)']; 
$i++; } 

數列中存儲了一個0,1,2或3對每一個名稱,以便在陣列傷愈復出共計有多少名有針對每個號碼..這工作正常。

唯一的問題是,如果所有名稱都有一個數字1存儲在它們對應的數組中,我的數組條目'stat0'不會告訴我有多少個0,因爲它被替換爲1的數量(這是因爲那裏在陣列中沒有0,所以第一個輸出是1秒)..

如何找出有多少個名稱在其編號列中包含0s 1s 2s和3s,包括什麼時候沒有?..預先感謝。

回答

3
SELECT numbers.number , 
     COUNT(name) 
FROM (SELECT 0 AS number 
      UNION ALL 
      SELECT 1 
      UNION ALL 
      SELECT 2 
      UNION ALL 
      SELECT 3 
     ) numbers 
     LEFT JOIN people ON people.number = numbers.number AND id='$id' 
GROUP BY numbers.number 

或者,如果你有一個永久的數字表按評論

SELECT numbers.number , 
     COUNT(name) 
FROM numbers 
     LEFT JOIN people ON people.number = numbers.number 
          AND id = '$id' 
WHERE numbers.number BETWEEN 0 AND 3 
GROUP BY numbers.number 
+0

感謝馬丁,你會這麼好心地解釋它是如何工作? – Wez

+0

您只能選擇數據中存在的值。這將創建一個帶有所有值的內聯派生表(永久輔助數字表有用,我認爲可能更有效)。左連接保留左輸入的所有值,即使右輸入中沒有匹配。 –

+0

那是很大的,所以如果我有一個對我的號碼的AUX /參考表,然後我可以加入這個選擇轉換,而不是創建一個內嵌表的?這將如何改變這種說法? – Wez