Mysql 每次从我的数据库中随机获取10个ID

Mysql 每次从我的数据库中随机获取10个ID,mysql,sql,random,sql-order-by,sql-limit,Mysql,Sql,Random,Sql Order By,Sql Limit,我每次需要10个随机ID。每次我请求一个新的集合时,我都需要获得一组新的随机ID,但是新的ID不能包括我以前多次请求一个新集合时已经获得的ID,除非进程被重置。我的数据库中可能总共有1亿或100万个ID。我计划使用ID在网页上显示10个项目,包括下一个和上一个按钮。如果用户返回到以前显示的任何页面,则已显示的页面必须与显示的原始项目一致 我有一个想法,我用种子选择随机数1000次,存储在redis服务器上,当用户进入页面时,每10行弹出一次。有什么不同的想法吗?您正在寻找可重复的随机排序。在My

我每次需要10个随机ID。每次我请求一个新的集合时,我都需要获得一组新的随机ID,但是新的ID不能包括我以前多次请求一个新集合时已经获得的ID,除非进程被重置。我的数据库中可能总共有1亿或100万个ID。我计划使用ID在网页上显示10个项目,包括下一个和上一个按钮。如果用户返回到以前显示的任何页面,则已显示的页面必须与显示的原始项目一致


我有一个想法,我用种子选择随机数1000次,存储在redis服务器上,当用户进入页面时,每10行弹出一次。有什么不同的想法吗?

您正在寻找可重复的随机排序。在MySQL中,可以通过将种子传递给数学函数
rand()
,如下所示:

对于相等的参数值,
RAND(N)
每次返回相同的值,从而生成一个可重复的列值序列

这将提供前10条记录:

select t.*
from mytable t
order by rand(12345)
limit 10
然后可以分页;要获取“下一个”10条记录,请使用相同的种子来
rand()
,并
offset
结果:

select t.*
from mytable t
order by rand(12345)
limit 10 offset 10

对于大量不重复的“随机”数字,您可能最好使用加密。如果数字不重复,那么它们就不是真正随机的,因为它们被限制不重复。每次选择一个数字时,可用数字池都会缩小。因此,输出不是真正随机的

要实现,请设置计数器:0、1、2、3、。。。选择一个常量键。然后使用密钥加密计数器以获得非重复输出。然后递增计数器,准备生成下一个输出。因为加密是可逆的,所以使用同一密钥的不同输入保证提供不同的输出。加密是一对一的过程

AES将为您提供128个非重复位,DES仅为64位。如果128位不够,那么您必须对较大的分组密码进行一些研究,例如Rijndael