2014-11-12 5 views
0

У меня есть приложение со 40 вопросами. Я держу вопросы в tbQuestion и их соответствующие ответы в tbAnswer вместе с тем, что пользователь выбрал в tbResult.Нужно SQL-запрос для приложения для викторины

Вот структура таблицы:

tbQuestion:  tbAnswer:  tbResult: 
QuestionID  AnswerID   ResultID 
QuestionText  QuestionID  QuestionID 
       AnswerText  AnswerID 
            UserID 

Я хочу, чтобы выбрать все вопросы, но указывают на меня ли они ответили или нет, если есть строка в tbResult. Это что-то похожее на следующий запрос, но это только выбор вопросов, на которые я ответил. Я хочу использовать AS Answered как показатель того, был ли получен ответ. Пустой, если он не ответил, answerID, если он был дан ответ.

SELECT tbQuestion.QuestionID, QuestionText, tbAnswer.AnswerID, AnswerText, tbResult.AnseredID AS Answered 
FROM tbQuestion 
JOIN tbAnswer ON tbQuestion.QuestionID = tbAnswer.QuestionID 
LEFT OUTER JOIN tbResult ON tbQuestion.QuestionID = tbResult.QuestionID 
WHERE tbResult.UserID = 1234567 

Также есть 39 радио ввод ответов (один ответ на каждый вопрос) и 1 вопрос с флажками, где пользователь может иметь несколько ответов на один вопрос, так что я должен знать AnswerID из каждого ответа они дали ,

ответ

0

Переместить условие в вашем ИНЕКЕ в пункте ON внешнего соединения:

select q.questionid, 
     q.questiontext, 
     a.answerid, 
     a.answertext, 
     r.anseredid as answered 
    from tbquestion q 
    join tbanswer a 
    on q.questionid = a.questionid 
    left join tbresult r 
    on q.questionid = r.questionid 
    and r.userid = 1234567 -- moved to on clause 

Сейчас ваш запрос только с указанием вопросов фактически ответил пользователем, потому что ваши критерии, определяющие пользователя, находятся в предложении WHERE. Если пользователь никогда не заполняет ответ для заданного вопроса, у него не будет строки на tbresult (для данного вопроса), поэтому строка будет нулевой. Чтобы разрешить нули, вы помещаете такие критерии в on-предложение внешнего соединения.

0

Попробуйте только LEFT OUTER JOIN tbAnswer

SELECT tbQuestion.QuestionID , 
    QuestionText , 
    tbAnswer.AnswerID , 
    AnswerText , 
    tbResult.AnseredID AS Answered 
FROM tbQuestion 
    LEFT OUTER JOIN tbAnswer 
     ON tbQuestion.QuestionID = tbAnswer.QuestionID 
    LEFT OUTER JOIN tbResult 
     ON tbQuestion.QuestionID = tbResult.QuestionID 
WHERE tbResult.UserID = 1234567 
0

Вы могли бы использовать:

SELECT tbQuestion.QuestionID, QuestionText, tbAnswer.AnswerID, AnswerText, 
     case when 
      tbResult.ResultId is null 
       then convert(bit, 0) 
       else convert(bit, 1) 
     END AS Answered 
FROM tbQuestion 
JOIN tbAnswer ON tbQuestion.QuestionID = tbAnswer.QuestionID 
LEFT OUTER JOIN tbResult ON tbQuestion.QuestionID = tbResult.QuestionID 
    and tbAnswer.AnswerId = tbResult.AnswerId 
    and tbResult.UserID = 1234567 

, чтобы получить большую часть ответа на ваш вопрос. , когда у вас есть несколько результатов (для вашего множественного выбора), как вы хотите, чтобы этот результат отображался, так как это будет несколько resultIds для одного вопроса?

Смежные вопросы