MySQL-如何选择未在另一个表中选择的行

时间:2019-07-19 02:19:18

标签: php mysql

我正在使用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 |
+----+------------------------------+

1 个答案:

答案 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关系

希望您能理解这些内容。