【问题标题】:Need T-SQL query to get multiple choice answer if matches如果匹配,需要 T-SQL 查询以获得多项选择答案
【发布时间】:2017-09-11 09:58:21
【问题描述】:

例子:

Question_Answers:

    +------+--------+
    | q_id | ans_id |
    +------+--------+
    |    1 |      2 |
    |    1 |      4 |
    |    2 |      1 |
    |    3 |      1 |
    |    3 |      2 |
    |    3 |      3 |
    +------+--------+

User_Submited_Answers:

    | q_id | sub_ans_id |
    +------+------------+
    |    1 |          2 |
    |    1 |          4 |
    |    2 |          1 |
    |    3 |          1 |
    |    3 |          2 |
    |    3 |          4 |
    +------+------------+

如果此行匹配 count 1 else 0,我需要一个 T-SQL 查询

【问题讨论】:

  • 你想要什么输出?似乎每个问题都有不止一个答案。
  • 它是一个多选题,每个问题一个标记,如果用户提交的答案与问题答案匹配,那么我应该没有用户提交的正确问题
  • 为什么用户要为一个问题提交多个答案?你的预期输出是什么?你能回答我的问题吗?
  • 你想达到什么目的?正如@TimBiegeleisen 所说,为什么用户要提交多个答案?
  • 因为它是一个多项选择题,我们在一个复选框中为单个问题显示超过 3 个选项,用户将标记多个选项

标签: sql sql-server sql-server-2008


【解决方案1】:
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

【讨论】:

  • 不像这样我想得到用户提交的正确答案示例:q_id 3 有 3 个正确选项用户为此标记数提交了 1 个错误答案 0
  • 收到错误消息 156,级别 15,状态 1,第 6 行关键字“as”附近的语法不正确。
  • 我在CASE 表达式中遗漏了END,抱歉。
  • 好的,谢谢,在这种情况下我弄错了:question_answers 选项为 2,用户提交的答案为 3,它给出的是 1 而不是 0
  • 向我们展示您想要的实际输出。我已经回答了我理解的问题。
【解决方案2】:

试试下面的代码:

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

【讨论】:

    【解决方案3】:

    这应该会给你每个问题的预期结果。

    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
    

    【讨论】:

      【解决方案4】:

      MySQL 解决方案(sql fiddle):

      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;
      

      现在,一步一步解释:

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

      • question_answers 表中提取用户未填写的答案(在您的示例中:q_id = 3ans_id = 3
      • user_submited_answers 表中提取用户填写的错误答案(在您的示例中:q_id = 3sub_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;
      

      从前面的查询结果来看,我们正在查找的行(错误答案)包含 NULL 值(根据情况,在question_answers 表或user_submited_answers 表中)。

      下一步是使用 IF 或 CASE 语句将这些行标记为 0(错误答案):IF(qa.q_id = usa.q_id, 1, 0)

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

      检查 sql fiddle:SQL Fiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 2019-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-17
        • 1970-01-01
        相关资源
        最近更新 更多