在MySQL中选择随机行

时间:2009-08-16 07:00:12

标签: sql mysql

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

我的问题表如下:

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

qno是主键,type用于跟踪测验类型。:

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

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

MySQL有没有办法选择随机行?

4 个答案:

答案 0 :(得分:25)

您可以使用MySQL中的rand函数对行进行排序,然后使用limit获取前10名(或多个您想要的名称)。

select * from table order by rand() limit 10

如果您只想要数学问题:

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

答案 1 :(得分: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

使用具有预定随机值的列可以节省您为页面的每个请求为表中的每一行运行随机化函数。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

要随机选择可能重复的行

Select Cus_Id from Customer
Where Cus_Id in (
SELECT ABS(CHECKSUM(NewId())) % (select COUNT(*) from Customer) - 0 AS Random FROM Customer)

如果您要从特定点(id 1500及以上)开始,以缩小范围

Select Cus_Id from Customer
Where Cus_Id in (
SELECT ABS(CHECKSUM(NewId())) % (select COUNT(*)+1500 from Customer) - 1300 AS Random FROM Customer)

如果要少一些,可以添加SELECT TOP x或TOP x PERCENT