请问从数据库随机选择了一条数据,然后第二次随机的时候就排除掉这条数据,假设一分钟内。应该怎么做呢

我想的是,随机一个出来就存到redis,然后记一个时间。第二次随机的时候从redis取出来然后过滤,但感觉这方法有点不优雅,想问问大家有什么优雅的解决方法吗

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 12

随机出来的数据存个id 然后第二次随机的时候加个条件 id!=第一次存的id

1年前 评论
Laravel_Panda (楼主) 1年前

存缓存里面 具体是redis 还是数据库里面都可以 要不然你没法拿到

1年前 评论

能不能按照时间的唯一性去做随机查询呢?不同时间的有不同的随机池。如果是在一分钟内的话,是不是可以按照60个维度的随机池。

1年前 评论
Laravel_Panda (楼主) 1年前
CodeUndefined (作者) 1年前

添加一个字段,取出时顺便修改那个字段,比如时间戳或批次。然后,下次查询时排除该批次该字段非空有时间戳的。

1年前 评论

换个思路全取出来存redis里,然后一个个从redis里面随机去,然后loop :joy:

1年前 评论

第一步:把所有数据的id取出来,转换成一纬数组,打乱数组顺序,然后循环push到redis的list里面

第二步:每次从list里面pop一个id出来,用id去数据库取数据

第三步:当list里面数据pop完之后,重复第一步

1年前 评论
Laravel_Panda (楼主) 1年前

布隆过滤器可以实现哦

1年前 评论

可以考虑使用一个临时表来记录随机选择的数据,并在第二次随机的时候,通过查询临时表来排除已经随机选择的数据。 例如,假设有一个数据表 my_table,包含如下字段:

id   name

第一次随机选择数据的 SQL 语句可能如下:

SELECT * FROM my_table ORDERBY RAND() LIMIT 1;

第二次随机选择数据的 SQL 语句可能如下:

SELECT * FROM my_table WHERE id NOTIN (SELECT id FROM tmp_table) ORDERBY RAND() LIMIT 1;

上面的 SQL 语句中,首先通过子查询从临时表 tmp_table 中查询已经随机选择的数据,然后通过 NOT IN 操作符来排除已经选择的数据。

此外,如果需要在一分钟内排除已经随机选择的数据,可以在临时表中记录随机选择的数据的时间,并在第二次随机的时候,通过比较时间来判断是否需要排除该数据。例如,可以将临时表的字段增加如下:

id   name   selected_time

第一次随机选择数据的 SQL 语句可能如下:

SELECT * FROM my_table ORDERBY RAND() LIMIT 1;

然后将选择的数据插入到临时表中,并记录选择时间。例如:

INSERTINTO tmp_table (id, name, selected_time) VALUES (:id, :name, :selected_time);

第二次随机选择数据的 SQL 语句可能如下:

SELECT*FROM my_table WHERE id NOTIN (SELECT id FROM tmp_table WHERE selected_time > DATE_SUB(NOW(), INTERVAL1MINUTE)) ORDERBY RAND() LIMIT 1;

上面的 SQL 语句中,首先通过子查询从临时表 tmp_table 中查询一分钟内已经随机选择的数据,然后通过 NOT IN 操作符来排除已经选择的数据。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!