2012-03-11 51 views
1

我有以下的sql查詢,返回3級學生在測試中作出的。
學生1在考試中取得0,所以我的查詢結果只返回兩個學生的成績,我怎麼能在結果中包含零?我怎樣才能返回0使用sql中的計數功能

select u.uno, u.fname, u.lname, count(q.qno) as Test1 from ((users u 
LEFT OUTER JOIN userresponse ur on ur.uno = u.uno) left outer join 
question q on q.correctanswer = ur.response and q.qno = ur.qno and 
q.eno = ur.eno) where q.eno = '1' group by u.uno, u.fname, u.lname 

ur.eno是考試1,那麼問題編號和考試號連接並q.corectanswer = ur.response檢查什麼問題的用戶得到正確的ur.uno = u.uno剛剛加入表。

+3

對於什麼數據庫?這就是爲什麼不使用ANSI-89 JOIN語法(你的查詢) - 沒有OUTER JOIN支持,但是子查詢將是等價的(但不太可取 - 相關的子查詢有效)。 – 2012-03-11 07:09:19

+0

@OMGPonies - 在大多數數據庫中通常使用外連接功能(通常基於使用'+'或'*'裝飾比較結果),但同意移動到ANSI連接要好得多 – 2012-03-11 07:30:41

+0

@Damien_The_Unbeliever:是的,那裏但它們也是供應商特定的。 [SQL Server](http://stackoverflow.com/questions/1428144/sql-what-does-mean),[Oracle](http://stackoverflow.com/questions/2425960/oracle-old-joins-a-工具腳本的轉換) – 2012-03-11 15:33:08

回答

3

如果我正確理解您的數據庫模式,第三名學生(應該得到0結果)在userresponse表中沒有對應的行嗎?正常的(「內部」)連接,就像您正在使用的連接一樣,將放棄沒有行的學生加入到userresponse表中。另一方面,外連接將保留行,即使沒有行將其連接到另一個表中。所以你應該在表用戶和表user用戶之間使用一個外連接。

編輯:

像這樣(未測試):

SELECT user.uno, user.fname, user.lname, 
     (COUNT(question.qno)*5)/75 as TESTRESULT1 
    FROM ((user LEFT OUTER JOIN userresponse ON ....) 
     LEFT OUTER JOIN question ON ....) 
WHERE 
    .... 
GROUP BY user.uno, user.fname, user.lname 

後ON的添加您的加盟條件和WHERE後的附加條件。第一個外部聯接將保留所有學生,但對於沒有響應的學生,在用戶響應的列中使用空值。第二個外連接仍然會讓學生沒有回覆,表格問題列中的空值。

請注意,由於COUNT(*)對行進行計數,因此您需要將COUNT(*)更改爲COUNT(question.qno),並且每個沒有響應的學生現在將在結果中包含一行。

+0

這就是正確的學生3將是無效的,因爲沒有他的答案的匹配問題,正確的答案我擡頭外連接,並試圖q.correctanswer = ur.response(+),但它給了我一個錯誤 – user541597 2012-03-11 07:23:09

+0

我無法得到這個工作。我使用(userresponse你左外連接問題q上q.correctresponse = ur.response)然後我需要包括用戶表需要加入用戶響應表。我不明白你的格式。 – user541597 2012-03-11 07:57:27