我来说下我的理解吧
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)
分别执行看下结果集是不是比较接近。