我有以下sql查询,它返回测试中的3年级学生 学生1在考试中取0,所以我的查询结果只返回两个学生的成绩我怎么能在结果中包含零?
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只是加入表格。
答案 0 :(得分:3)
如果我正确理解了您的数据库架构,那么应该获得0结果的第三个学生在userresponse表中没有相应的行?正常(“内部”)连接(如您正在使用的连接)将删除没有行的学生在userresponse表中加入它们。另一方面,外部联接将保留行,即使没有行将它们连接到另一个表中也是如此。因此,您应该在表用户和表userresponse之间使用外部联接。
编辑:
像这样(未经测试):
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之后添加其他条件。第一个外部联接将保留所有学生,但是对于没有回复的学生,来自userresponse的列中包含空值。第二个外部联接仍然会让学生没有回复,表格中的列中的值为空值。
请注意,您需要将COUNT(*)更改为COUNT(question.qno),因为COUNT(*)会计算行数,而没有响应的每个学生现在都会在结果中添加一行。