Sql 构造where子句以包含null/0值时出现问题
我有一个应用程序,用户可以参加测试(由问题和答案组成) 我试图构造一个查询,返回一个按问题分组的答案计数,用于特定的教师和测试。 问题是,对于没有答案的问题,我希望查询返回0计数 答案Sql 构造where子句以包含null/0值时出现问题,sql,postgresql,Sql,Postgresql,我有一个应用程序,用户可以参加测试(由问题和答案组成) 我试图构造一个查询,返回一个按问题分组的答案计数,用于特定的教师和测试。 问题是,对于没有答案的问题,我希望查询返回0计数 答案 身份证 问题编号 测试id 学生证 问题 身份证 师生 学生证 教师id 测验 身份证 查询 输出 所需输出 rcount | question_id --------+---- 4 | 1 0 | 2 2 | 3 0 | 4 如果我删除tea
- 身份证
- 问题编号
- 测试id
- 学生证
- 身份证
- 学生证
- 教师id
- 身份证
rcount | question_id
--------+----
4 | 1
0 | 2
2 | 3
0 | 4
如果我删除
teacher\u students.teacher\u id=1
,返回的问题数是正确的,但计数不是正确的。将teacher\u students.teacher\u id=1
从WHERE
子句移动到加入ON
子句
当引用左联接
右侧表的条件放入WHERE子句时,左联接将被取消,并充当内部联接
SELECT count(teacher_students.student_id) AS rcount <--- changed
, questions.id
FROM "questions"
LEFT JOIN answers
ON answers.question_id = questions.id
LEFT JOIN teacher_students
ON teacher_students.student_id = answers.student_id
AND teacher_students.teacher_id = 1
WHERE questions.test_id = 1
GROUP BY questions.id
ORDER BY questions.id
选择count(教师学生.学生id)作为rcount您的答案是好的。但在结构上,最好只为联接保留ON
子句。所以最好这样做:((teacher\u students.teacher\u id=1)或(teacher\u students.teacher\u id为NULL))
在WHERE
子句上。@Karolis:不。如果人们要使用外部连接语法,他们必须意识到WHERE
中的标准与外部连接的on子句中的标准之间存在差异。使用外部联接时,WHERE子句条件在联接后应用,而子句条件在联接前应用。你所提倡的可能会产生一个与预期截然不同的结果集。@Karolis“但从结构上来说更好”你能详细说明一下吗?我从未考虑过向连接谓词添加附加条件。这样做的内在结构问题是什么?@Karolis:是的,我同意,你的建议可能会更好地让任何稍后查看代码的人都清楚地了解意图。处理或条件并不是MySQL优化器的最佳属性。为了保持指定连接条件的ON子句的纯洁性,编写它的方法是将对teacher\u students的引用更改为对过滤teacher\u students的内联视图的引用。规划者会将此视为将过滤条件放在ON子句中一样,但实际上,它会更清楚地说明该语句的含义。但有些人认为任何子查询都是“天哪!糟糕的复杂性!”
rcount | question_id
--------+----
4 | 1
0 | 2
2 | 3
0 | 4
SELECT count(teacher_students.student_id) AS rcount <--- changed
, questions.id
FROM "questions"
LEFT JOIN answers
ON answers.question_id = questions.id
LEFT JOIN teacher_students
ON teacher_students.student_id = answers.student_id
AND teacher_students.teacher_id = 1
WHERE questions.test_id = 1
GROUP BY questions.id
ORDER BY questions.id