mysql随机获取一条或者多条数据 - osc_rm0mt9zx的个人空间 - OSCHINA - 中文开源技术交流社区my.oschina.net
网上的方案都不是很靠谱
select * from users order by rand() LIMIT 1
SELECT * FROM users AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(userId) FROM `users`)-(SELECT MIN(userId) FROM users))+(SELECT MIN(userId) FROM users)) AS userId) AS t2 WHERE t1.userId >= t2.userId ORDER BY t1.userId LIMIT 1
SELECT * FROM users WHERE userId >= ((SELECT MAX(userId) FROM users)-(SELECT MIN(userId) FROM users)) * RAND() + (SELECT MIN(userId) FROM users) LIMIT 1
首先我们分析一下业务诉求
是真的需要完全随机还是需要每次都拿到不同的记录,如果是完全随机就有可能出现重复的记录,同一时间执行SQL的用户拿到的数据有可能相同
如果是为了保证在并发情况和长时间上不频繁出现重复,则应考虑的方案为:
一、把已有的记录加入队列,每次新请求从队列获取一条,队列为空时重新追加
好处是记录数量较少、请求量较少时保证了一段时间内不重复,但可能出现稳定的重复规律