2011-02-11 145 views
2

我有一个表“masterurls”它有超过一百万条记录。每次执行查询时,我都想获取随机记录。它不应该有以前执行中获取的任何记录。我已经有这个疑问:如何在每次执行SQL查询时选择随机唯一记录

SELECT m.url FROM masterurls ORDER BY RAND() LIMIT 200

的问题是上面的查询只返回前200百分的记录,每次随机化它。

+1

`m`没有被定义。和哪种编程语言? – Starx 2011-02-11 06:25:49

回答

1

既然你可以通过种子参数来RAND()功能,你可以在“分页”通过生成第一页之前种子的随机结果。

示例代码: 第一页(因语言而异):

int seed = Math.abs(new Random().nextInt()); 

SQL查询:

SELECT url FROM masterurls ORDER BY RAND({seed}) LIMIT 200; 

商店种子某处(基于Web的应用程序,你可以使用一个url参数或会话)。 在接下来的页面:

SELECT url FROM masterurls ORDER BY RAND({seed}) LIMIT 200 * {pageNumber}, 200; 

注:RAND()排序是一项繁重的操作,你可能会更好存储与URL的哈希码一个索引列,然后使用一个基于模块或其他随机函数。

1

你如何知道url是否已经被访问过。我最好的建议是在表格中设置一个标志来知道这一点。在表格中添加一个类似于视图的字段,该字段将接受两个值1或0,1表示已访问,0表示未访问。然后,你可以使用

SELECT m.url FROM masterurls m WHERE view='1' ORDER BY RAND() LIMIT 200; 
+0

如何将他们更新到`view = 1` **时访问第二组行**?我建议 - 基于这个答案,这个答案一次只能用一个查看器 - 列值为0 1或2,现在可以查看0 =。 1 =查看现在和2 =查看。运行'UPDATE SET view = 1 WHERE view = 0 ORDER BY RAND()LIMIT 200`,然后选择200行(`SELECT WHERE view = 1`),最后执行`UPDATE SET view = 2 WHERE view = 1` 。 – 2011-02-11 06:36:35

+0

我只写了查询来检索记录,而不是更新。我正在考虑更新网页或表单中的记录。所以,我问了哪种编程语言,因为我不知道只能从SQL执行此操作。 – Starx 2011-02-11 06:41:14