如何解决MySQL从数据库中选择不重复的随机数
我只是想知道我能否做到。 谢谢您提前帮助我。
我的数据库中有100000个ID。 我想从100000中随机选择10个ID。 如果我转到下一页,我还将从数据库中随机选择10个ID(以前的ID不会重复) 最后,我选择了所有100000个ID。
如果刷新页面,页面将从头开始重新启动。
我有一个想法,选择带有种子的1000次随机数,并将其存储在redis上,并在用户进入页面时每10行弹出一次。有什么不同的想法吗?
我一次需要10个随机ID。每次我要求一个新的ID时,我都需要获得一组新的随机ID,但是新的ID必须不包括我以前要求一个新的ID之前已经获得的任何ID。重启。我的数据库中可能总共有100个或100万个ID。我计划使用ID在网页的A上显示10个项目,并带有下一个和上一个按钮。如果用户返回到先前显示的任何页面,则已经显示的页面必须与显示的原始项目一致
来自@ Scratte 感谢您澄清我想说的话!
如果不可能,也可以。谢谢。
解决方法
我只是在这里添加一个想法。您将需要将其转换为代码。
您首先从数据库中批量获取行,而不是从10
的切片中获取行。这是通过减少数据库往返来提高性能。
从数据库获取1000行并将其存储在session
中。
查询:
Select *
from table
where id NOT IN (previous_ids)
order by rand()
limit 0,1000
注意:由于ID是索引列,因此NOT IN
应该更快。
现在,您有1000行,将所有行存储在会话中。当用户请求的页面是1000的倍数时,只有,您才会向数据库触发另一个查询。这给您摊销的性能。见下文:
page_request = 1
if (page_request - 1) % 1000 == 0:
fire DB to get next 1000 rows
$_SESSION['data'][intval(page_request / 1000)] = fetched_rows
当用户请求页面时,您将获得如下数据:
key = intval(page_request / 1000)
record_offset = (page_request % 1000 - 1) * 10
return array_splice($_SESSION['data'][key],record_offset,10)
如果用户完全刷新页面,则只需执行shuffle
即可像shuffle($_SESSION['data'][key])
一样随机地重新排列元素,然后返回到前端。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。