Построение задачи для предложения where для включения значений NULL / 0 - PullRequest
1 голос
/ 30 июня 2011

У меня есть приложение, в котором пользователи могут сдавать тесты (которые состоят из вопросов и ответов).

Я пытаюсь создать запрос, который возвращает количество ответов, сгруппированных по вопросам, для конкретного учителяи проверить.Проблема в том, что я хочу, чтобы запрос возвращал 0 для вопросов без ответов.

ответов

  • id
  • question_id
  • test_id
  • student_id

вопросы

  • id

teacher_students

  • student_id
  • teacher_id

тесты

  • id

Запрос

   SELECT COUNT(answers.id) AS rcount,
          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
    WHERE (questions.test_id = 1)  
      AND (teacher_students.teacher_id = 1)
 GROUP BY questions.id 
 ORDER BY questions.id

Вывод

 rcount | question_id 
--------+----
      4 | 1
      2 | 3

Требуемый вывод

 rcount | question_id 
--------+----
      4 | 1
      0 | 2
      2 | 3
      0 | 4

Если я уберу teacher_students.teacher_id = 1, количество возвращенных вопросов будет правильным, но количество не будет.

1 Ответ

3 голосов
/ 30 июня 2011

Переместите чек teacher_students.teacher_id = 1 из предложения WHERE в объединяющее предложение ON.

Когда условие, которое ссылается на таблицу в правой части LEFT JOIN, помещается в предложение WHERE, LEFT JOIN отменяется и действует как INNER JOIN.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...