我有一张表“braurls”它有超过100万条记录。我想在每次执行查询时获取随机记录。它不应该包含先前执行中提取的任何记录。我已经有了这个问题:
SELECT m.url FROM masterurls ORDER BY RAND() LIMIT 200
问题是上面的查询只返回前200条记录并每次随机化。
答案 0 :(得分:2)
您如何知道之前是否已访问过该网址。我最好的建议是设置一个标志,以便在表格中知道这一点。在表中添加一个类似于视图的字段,它将接受两个值1或0,1表示已访问,0表示未访问。然后你可以使用
SELECT m.url FROM masterurls m WHERE view='1' ORDER BY RAND() LIMIT 200;
答案 1 :(得分:2)
由于您可以将种子参数传递给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()
排序是一项繁重的操作,您可能最好使用网址的哈希代码存储索引列,然后使用基于模块或其他随机函数。