2012-03-11 23 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