2009-08-16 92 views
10

我正在开发一个测验网站,我有一个存储所有问题的数据库。 有不同类型的测验,如数学,科学,历史等。所有的问题都存储在一张表中。在MySQL中选择随机行

我的问题表看起来像这样:

questions (qno(int) ,type(int), question, .... ,...) 

qno是主键,并且type被用来跟踪测验类型:

if type = 1 (math) 
type = 2(science) 

现在,我要选择针对每种类型的测试的一些随机问题。例如,我可能只想为数学考试选择一些随机的20个问题。

MySQL有一些方法可以选择随机行吗?

+0

dup [如何在SQL中请求随机行?](http://stackoverflow.com/q/19412/),[从mysql中的大表中快速选择一个随机行](http:// stackoverflow.com/q/211329/90527)。 – outis 2012-03-30 03:45:11

+0

[MySQL从600K行中快速选择10个随机行](https://stackoverflow.com/a/4329447/6521116) – 2017-06-17 11:13:51

回答

19

您可以使用MySQL中的rand函数对行进行排序,然后使用limit取前10位(或者您想要的数量)。

select * from table order by rand() limit 10 

如果你想只是数学问题:

select * from table where type = 1 order by rand() limit 10 
+0

看到我想一次向用户显示一个问题。所以我在想,当测验开始时,我会使用上面的查询,然后我会将所有问题都存储在会话中,然后每次都会使用新的问题来检验每个问题。这是正确的方法吗? – user156073 2009-08-16 07:34:27

+0

如果你只想每页有一个问题,只要做'限制1'而不是'限制10'。 – Eric 2009-08-16 15:26:33

+0

存储该用户在表格中看到的问题,然后构造该查询,并将其添加到该表格中,以及查看表格的字段为空。 – Unsliced 2009-08-19 10:24:43

3

添加列到表,将举行一个UNIX时间戳。

每天或任何时间表适用于您,您运行一个查询来更新该列。

在这种情况下,您的查询应该在午夜运行,看起来像这样。

UPDATE table SET rand_id = (UNIX_TIMESTAMP() + (RAND() * 86400)); 

然后要检索行,可以使用与此类似的查询。

SELECT * FROM table WHERE rand_id > UNIX_TIMESTAMP() ORDER BY rand_id ASC LIMIT 20 

使用与预先确定的随机值的列节省您需要运行的表中的每一单排随机化功能为每一个请求的页面。

0

另一种可能性是生成一个random permutation,将其存储在会话中(或者只是您需要的部分,该算法很容易适应),并在需要时提取问题。