【问题标题】:Check if user completed all tests检查用户是否完成了所有测试
【发布时间】:2021-12-28 09:27:30
【问题描述】:

我有多个测试。每个用户可以参加所有这些测试超过 1 次。但他必须完成所有测试,然后才能再次参加。

所以如果有 5 个测试,用户必须完成这 5 个测试才能稍后再次进行。

测试表:

_________________
| id |   test   |
|____|__________|
|  1 |   test1  |
|____|__________|

问题表:

____________________________
| id | question |  test_id |
|____|__________|__________|
|  1 |    q1    |     1    |
|____|__________|__________|

答案表:

_______________________________
| id |  answer  |  question_id |
|____|__________|______________|
|  1 |    a1    |       1      |
|____|__________|______________|

然后我会创建一个表格来保存用户的答案:

用户回答表:

________________________________________________________
| id |  user_id  |  test_id  |  question_id | answer_id |
|____|___________|___________|______________|___________|
|  1 |      1    |     1     |       1      |     1     |
|____|___________|___________|______________|___________|

为了检查用户是否完成了测试,我将从表 user_answers 中计算用户使用 id = x 的测试答案,并将它们与表 questions 中的此测试的问题数进行比较。如果两个数字匹配,那么它就完成了。如果没有,那就没有完成。

但问题是,如果用户回答了测试的所有问题,然后将新问题添加到该测试中,则会被视为未完成。

那么如何在不考虑新增问题和删除问题的情况下检查用户是否回答了所有测试问题?

请注意:每个问题都是单独提交的,因此用户不必一次提交所有问题,因此我不能依赖用户回答问题的日期

【问题讨论】:

  • 您可能取决于系统注意到用户已完成所有当前存在的问题的日期。将其存储在将用户链接到测试的表中。然后将其与任何给定问题添加到测试中的日期进行比较。
  • 或者,考虑对测试甚至问题本身进行版本控制(如果问题可以在创建后修改)。因此,对于与测试相关的每个问题,您还需要存储它包含的测试版本。您将有一个表格存储测试的版本历史记录和每个版本的创建日期。然后,当用户开始测试时,您将存储当时测试的版本。然后,您可以使用它来确定他们是否完成了当时与测试相关的所有问题。

标签: mysql sql database-design


【解决方案1】:

您可以添加一个保存 question_id user_id 的新表,当用户回答问题时,您将该问题标记为不是新问题

| question_id |  user_id | new_question

要知道是否所有答案都已回答,请排除所有标记为新的问题

【讨论】:

    【解决方案2】:

    添加新表

    user_tests [id, test_id, user_id, question_count, answer_count]
    

    您可以获得未完成测试的计数:

    SELECT * 
    FROM user_tests 
    WHERE question_count != answer_count 
    AND user_id = 11
    

    【讨论】:

      猜你喜欢
      • 2015-01-19
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 2021-04-11
      • 2020-02-19
      • 1970-01-01
      • 2022-06-15
      相关资源
      最近更新 更多