mysql随机获取一条或者多条数据SQL分析
从数据库随机取5条
用户数据
SELECT * FROM user WHERE id >= ((SELECT MAX(id) FROM user)-(SELECT MIN(id) FROM user)) * RAND() + (SELECT MIN(id) FROM user) LIMIT 5
这段SQL语句是在网上找的,想请问一下 id >= ((SELECT MAX(id) FROM user)-(SELECT MIN(id) FROM user)) * RAND() + (SELECT MIN(id) FROM user)
是怎么达到随机获取的?TKS
如果我改成 id >= 1
,则顺序取出了id为1,2,3,4,5的用户!
这段sql
SELECT * FROM user WHERE id >= ((SELECT MAX(id) FROM user)-(SELECT MIN(id) FROM user)) * RAND() + (SELECT MIN(id) FROM user) LIMIT 5
是执行了5次吗?如果一次的话,结果应该就不是随机的了,就像id >=?
某个值了,取出来是连续的!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
先说我测试的结论,LIMIT 5调用了很多次where后的查询条件。
这样LIMIT 5的含义我用了一个例子证实了一下。
例子:
1.创建test表,两个字段:主键id,count
2.创建mysql function
3.执行一下语句
SELECT * FROM user WHERE id >= (select fun()) LIMIT 5
4.看一下test表,
id count
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1
11 1
12 1
13 1
14 1
至于为什么会执行这么多次function,我认为是跟limit的机制有关
明白题目的意思了,理解错误抱歉。
更新:我的user表是14条数据,现在目测的原因是LIMIT前的where条件,同LIMIT函数遍历了整个表单,也是就是执行了14次
我来说下我的理解吧
关于最大减去最小值乘以随机值获取随机数的概念就不说了,只针对上面的sql在mysql解析层的处理作下说明,实际上mysql是做了这样的处理(因为是mysql在解析sql时做的优化,并不一定就是下面的sql,下面的sql只是本人理解大致的思路):
就是先根据rand()和id获取一遍随机数,再跟原表关联,最后取出5个值,因为是随机取,所以你的id值越平均,数据量越大,最后limit之前获取的id值就会越接近整表数据量的一半,limit 5取到的结果也越接近。
可以这么验证一下获取随机数的逻辑:
分别执行看下结果集是不是比较接近。
其实很好理解啊,按照sql的执行顺序,肯定是先执行
((SELECT MAX(id) FROM user)-(SELECT MIN(id) FROM user)) * RAND() + (SELECT MIN(id) FROM user) as a
,然后执行id>=a,limit 5就是去连续的5个值啊。你可以select top N * from table_name order by newid(); ----N是一个你指定的整数,随机排序后表是取得随机记录。