我正在使用php和mysql创建多项选择测验Web应用程序;每个测验10个问题。每次它将从数据库中随机选择10个问题,并将选定的qid插入到结果表中。
目前,我有两个表; questions
表用于查找问题和选项,而results
表用于存储选定的问题。
我的问题是如何选择结果表中不存在的问题? 我的数据库中有100个问题,如果用户遇到last(100)个问题该怎么办?
questions
表:
+-------+---------------+----------------+
| qids | q_text | q_options |
+-------+---------------+----------------+
| 1 | example1 |opt1, opt2, opt3|
| 2 | example2 |opt1, opt2, opt3|
| 3 | example3 |opt1, opt2, opt3|
+-------+---------------+----------------+
results
表:
+----+------------------------------+
| id | qids |
+----+------------------------------+
| 1 | 1,2,3,4,5,6,7,8,9,10 |
| 2 |11,12,13,14,15,16,17,18,19,20 |
+----+------------------------------+
答案 0 :(得分:0)
结果表的结构不适用于此目的。您可能希望在结果和问题之间使用hasMany关系。
您需要将每个问题存储在单独的行中。为此,我展示了第三个表(result_questions),该表将结果与hasMany关系中的问题相关联。也就是说:每个结果行都有很多问题。
问题表:
qids, q_text, q_options
结果表:
id, anyothercolumn
result_questions表:
id, resultid, qid
在result_questions表中,id是自动增加的,resultid是结果表中的外键,qid是问题表中的外键。
最后,我们将得到一个看起来像这样的表:
result_questions:
+----+----------+-----+
| id | resultid | qid |
+----+----------+-----+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 1 | 4 |
| 5 | 1 | 5 |
| 6 | 1 | 6 |
| 7 | 1 | 7 |
| 8 | 1 | 8 |
| 9 | 1 | 9 |
| 10 | 1 | 10 |
| 11 | 2 | 11 |
| 12 | 2 | 12 |
| 13 | 2 | 13 |
| 14 | 2 | 14 |
| 15 | 2 | 15 |
| 16 | 2 | 16 |
| 17 | 2 | 17 |
| 18 | 2 | 18 |
| 19 | 2 | 19 |
| 20 | 2 | 20 |
+----+----------+-----+
注意:如果随机选择问题,则上面的qid的顺序将是随机的,而不是顺序的。
然后您可以使用查询:
SELECT * FROM questions
WHERE id NOT IN (SELECT qid FROM result_questions)
ORDER BY RAND() LIMIT 10;
这将给您未曾提出的问题。创建新的结果行后,您希望将它们存储到result_questions表中,这样就不会再次被询问。
此外,您可能希望重构选项的存储方式。如果您知道最大数量的选项,则对每个选项使用单独的列,或者对选项的问题也使用hasMany关系
希望您能理解这些内容。