Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 构造where子句以包含null/0值时出现问题_Sql_Postgresql - Fatal编程技术网

Sql 构造where子句以包含null/0值时出现问题

Sql 构造where子句以包含null/0值时出现问题,sql,postgresql,Sql,Postgresql,我有一个应用程序,用户可以参加测试(由问题和答案组成) 我试图构造一个查询,返回一个按问题分组的答案计数,用于特定的教师和测试。 问题是,对于没有答案的问题,我希望查询返回0计数 答案 身份证 问题编号 测试id 学生证 问题 身份证 师生 学生证 教师id 测验 身份证 查询 输出 所需输出 rcount | question_id --------+---- 4 | 1 0 | 2 2 | 3 0 | 4 如果我删除tea

我有一个应用程序,用户可以参加测试(由问题和答案组成)

我试图构造一个查询,返回一个按问题分组的答案计数,用于特定的教师和测试。 问题是,对于没有答案的问题,我希望查询返回0计数

答案
  • 身份证
  • 问题编号
  • 测试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