如果匹配,则需要T-SQL查询以获取多选答案

如果匹配,则需要T-SQL查询以获取多选答案,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,例如: 表问题和答案: 用户提交的答案: 我需要一个T-SQL查询,如果此行与计数1匹配,否则为0,请尝试以下代码: SELECT t1.q_id, CASE WHEN COUNT(t2.sub_ans_id) = COUNT(*) THEN 1 ELSE 0 END AS is_correct FROM Question_Answers t1 LEFT JOIN User_Submited_Answers t2 ON t1.q_id

例如:

表问题和答案:

用户提交的答案:


我需要一个T-SQL查询,如果此行与计数1匹配,否则为0,请尝试以下代码:

SELECT
    t1.q_id,
    CASE WHEN COUNT(t2.sub_ans_id) = COUNT(*)
         THEN 1
         ELSE 0 END AS is_correct
FROM Question_Answers t1
LEFT JOIN User_Submited_Answers t2
    ON t1.q_id   = t2.q_id AND
       t1.ans_id = t2.sub_ans_id
GROUP BY t1.q_id
select qa.q_id,case when qa.ans_id=sqa.ans_id then 1 else 0 end as result from questionans qa
left  join subquestionans sqa
on qa.q_id=sqa.q_id and qa.ans_id=sqa.ans_id

这将为您提供每个问题的预期结果

select q_id, min(Is_Correct)Is_Correct from (
select Q.q_id,case when count(A.sub_ans_id)=count(*) then 1 else 0 end as Is_Correct
from #Q Q left join #A A on Q.q_id=A.q_id and Q.ans_id=A.sub_ans_id
group by Q.q_id
UNION ALL
select A.q_id,case when count(Q.ans_id)=count(*) then 1 else 0 end as Is_Correct
from #Q Q right join #A A on Q.q_id=A.q_id and Q.ans_id=A.sub_ans_id
group by A.q_id ) I group by q_id
MySQL解决方案:

现在,一步一步地解释:

为了获得正确的输出,我们需要:

从问答表中提取示例中用户未填写的答案:q_id=3,ans_id=3 从user_submited_answers表中提取示例中用户填写的错误答案:q_id=3,sub_ans_id=4 为此,我们可以对mysql左连接+右连接使用完全外部连接:

SELECT *
FROM question_answers qa
LEFT JOIN user_submited_answers usa
  ON qa.q_id = usa.q_id AND qa.ans_id = usa.sub_ans_id
UNION
SELECT *
FROM question_answers qa
RIGHT JOIN user_submited_answers usa
  ON qa.q_id = usa.q_id AND qa.ans_id = usa.sub_ans_id;
从前面的查询结果中,我们正在查找错误答案的行包含基于案例的空值,即问题答案表或用户提交的答案表

下一步是使用IF或CASE语句标记那些回答错误为0的行:IFqa.q_id=usa.q_id,1,0

要获得最终输出,我们需要按q_id分组,并在分组的行中查找0值。如果至少有一个0,则该问题的答案是错误的,应标记为该答案


检查sql FIDLE:

此处需要什么输出?似乎每个问题都有多个答案。这是一个多答案问题,每个问题都有一个标记,如果用户提交的答案与问题答案匹配,那么我应该不会收到用户提交的正确问题。为什么用户提交一个问题的多个答案?你的预期产出是多少?你能回答我的问题吗?你想得到什么?正如@TimBiegeleisen所说的,用户为什么要提交多个答案?因为这是一个多选问题,我们在复选框中为单个问题显示了超过3个选项,用户将标记多个选项不是这样的,我不想得到任何问题用户提交的正确答案示例:q_id 3有3个正确选项用户提交了1个错误答案对于此标记计数0获取错误消息156,级别15,状态1,第6行关键字“as”附近的语法不正确。我在大小写表达式中缺少结尾,抱歉。好的,谢谢,当此情况下我出错:问题答案选项为2,用户提交的答案为3,它给出的是1而不是0显示您想要的实际输出。我已经回答了我所理解的问题。
select q_id, min(Is_Correct)Is_Correct from (
select Q.q_id,case when count(A.sub_ans_id)=count(*) then 1 else 0 end as Is_Correct
from #Q Q left join #A A on Q.q_id=A.q_id and Q.ans_id=A.sub_ans_id
group by Q.q_id
UNION ALL
select A.q_id,case when count(Q.ans_id)=count(*) then 1 else 0 end as Is_Correct
from #Q Q right join #A A on Q.q_id=A.q_id and Q.ans_id=A.sub_ans_id
group by A.q_id ) I group by q_id
SELECT tmp.q_id, MIN(c) as correct
FROM (
    SELECT qa.q_id, IF(qa.q_id = usa.q_id, 1, 0) as c 
    FROM question_answers qa
    LEFT JOIN user_submited_answers usa
      ON qa.q_id = usa.q_id AND qa.ans_id = usa.sub_ans_id
    UNION
    SELECT usa.q_id, IF(qa.q_id = usa.q_id, 1, 0) as c 
    FROM question_answers qa
    RIGHT JOIN user_submited_answers usa
      ON qa.q_id = usa.q_id AND qa.ans_id = usa.sub_ans_id
) tmp
GROUP BY tmp.q_id;
SELECT *
FROM question_answers qa
LEFT JOIN user_submited_answers usa
  ON qa.q_id = usa.q_id AND qa.ans_id = usa.sub_ans_id
UNION
SELECT *
FROM question_answers qa
RIGHT JOIN user_submited_answers usa
  ON qa.q_id = usa.q_id AND qa.ans_id = usa.sub_ans_id;