mysql 多条 取一条_mysql随机获取一条或者多条数据SQL分析

我来说下我的理解吧

SELECT * FROM user WHERE id >= ((SELECT MAX(id) FROM user)-(SELECT MIN(id) FROM user)) * RAND() + (SELECT MIN(id) FROM user) LIMIT 5;

关于最大减去最小值乘以随机值获取随机数的概念就不说了,只针对上面的sql在mysql解析层的处理作下说明,实际上mysql是做了这样的处理(因为是mysql在解析sql时做的优化,并不一定就是下面的sql,下面的sql只是本人理解大致的思路):

SELECT user.* FROM user join (select round(((SELECT MAX(id) FROM user)-(SELECT MIN(id) FROM user)) * RAND() + (SELECT MIN(id) FROM user)) id from user) user_tmp on user.id=user_tmp.id order by user.id LIMIT 5;

就是先根据rand()和id获取一遍随机数,再跟原表关联,最后取出5个值,因为是随机取,所以你的id值越平均,数据量越大,最后limit之前获取的id值就会越接近整表数据量的一半,limit 5取到的结果也越接近。

可以这么验证一下获取随机数的逻辑:

select distinct round(((SELECT MAX(id) FROM user)-(SELECT MIN(id) FROM user)) * RAND() + (SELECT MIN(id) FROM user)) id from user;

SELECT * FROM user WHERE id >= ((SELECT MAX(id) FROM user)-(SELECT MIN(id) FROM user)) * RAND() + (SELECT MIN(id) FROM user)

分别执行看下结果集是不是比较接近。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值