【问题标题】:how to select random unique records on each execution of the SQL Query如何在每次执行 SQL 查询时选择随机唯一记录
【发布时间】:2011-02-11 06:15:30
【问题描述】:

我有一个表“masterurls”,它有超过 100 万条记录。我想在每次执行查询时获取随机记录。它不应该包含在以前的执行中获取的任何记录。我已经有这个查询:

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

问题是上面的查询只返回前 20000 条记录,并且每次都随机化。

【问题讨论】:

  • m 未定义。以及哪种编程语言???

标签: mysql


【解决方案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 的哈希码存储索引列,然后使用基于模块或其他随机函数。

【讨论】:

  • 谢谢!限制中的随机偏移想法解决了我的目的。
【解决方案2】:

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

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

【讨论】:

  • 如何访问第二组行同时将它们更新为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
  • 我只是写了查询来检索记录而不是更新。我正在考虑从网页或表单更新记录。所以,我问了哪种编程语言,因为我不知道只能从 SQL 中做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多