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)

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


版权声明:本文为weixin_40007541原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。