我有一个表“masterurls”,它有超过 100 万条记录。我想在每次执行查询时获取随机记录。它不应包含在先前执行中获取的任何记录。我已经有这个查询:
从 masterurls 中选择 m.url ORDER BY RAND() LIMIT 200
问题是上面的查询仅返回前 20000 个记录,并且每次都会对其进行随机化。
最佳答案
由于您可以将种子参数传递给 RAND()
函数,因此您可以通过在第一页之前生成种子来对随机结果进行“分页”。
示例代码: 对于首页(因语言而异):
int seed = Math.abs(new Random().nextInt());
SQL查询:
SELECT url FROM masterurls ORDER BY RAND({seed}) LIMIT 200;
将种子存储在某处(对于基于 Web 的应用程序,您可以使用 url 参数或 session )。 对于下一页:
SELECT url FROM masterurls ORDER BY RAND({seed}) LIMIT 200 * {pageNumber}, 200;
注意:按 RAND()
排序是一项繁重的操作,您最好使用 url 的哈希代码存储索引列,然后使用基于模块的函数或其他随机函数。
关于mysql - 如何在每次执行 SQL 查询时选择随机唯一记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4966154/