【Mysql疑问】从数据库中随机抽取数据,多次刷新会出现空白记录的原因

W_hale 2018-09-03 08:44:31
语句:SELECT paper_id,include_id,paper_type FROM paper WHERE paper_type in(SELECT stu_group FROM student_info WHERE stu_id=$id) AND paper_id >= ((SELECT MAX(paper_id) FROM paper)-(SELECT MIN(paper_id) FROM paper)) * RAND() + (SELECT MIN(paper_id) FROM paper) LIMIT 1

在使用本条语句产生随机结果时,刷新后,会出现取不到数据的情况,要刷新很多次才有可能取到数据,是否是因为字段使用paper_id产生随机数,但由于随机取到的并不一定符合where条件,所以显示空白呢?
...全文
560 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
W_hale 2018-09-12
  • 打赏
  • 举报
回复



引用 6 楼 zhangbin1988 的回复:

SELECT paper_id,include_id,paper_type FROM paper WHERE paper_type in(SELECT stu_group FROM student_info WHERE stu_id=$id) ORDER BY RAND() LIMIT 1;
rand()和order by不能连在一起用,全表扫描效率会降很低。
peng13759 2018-09-10
  • 打赏
  • 举报
回复
SELECT paper_id,include_id,paper_type
FROM paper
WHERE paper_type in(SELECT stu_group FROM student_info WHERE stu_id=$id)
AND paper_id >= ((SELECT MAX(paper_id) FROM paper WHERE paper_type in(SELECT stu_group FROM student_info WHERE stu_id=$id) )-
(SELECT MIN(paper_id) FROM paper WHERE paper_type in(SELECT stu_group FROM student_info WHERE stu_id=$id) )) * RAND() +
(SELECT MIN(paper_id) FROM paper WHERE paper_type in(SELECT stu_group FROM student_info WHERE stu_id=$id) )
LIMIT 1


取随机数的时候需要带上条件,但效率会降低
ayzen1988 2018-09-10
  • 打赏
  • 举报
回复

SELECT paper_id,include_id,paper_type FROM paper WHERE paper_type in(SELECT stu_group FROM student_info WHERE stu_id=$id) ORDER BY RAND() LIMIT 1;
ACMAIN_CHM 2018-09-04
  • 打赏
  • 举报
回复
另外,paper_type in(SELECT stu_group FROM student_info WHERE stu_id=$id) 条件之后,未必会有符合 paper_id >= ((SELECT MAX(paper_id) FROM paper)-(SELECT MIN(paper_id) FROM paper)) * RAND() + (SELECT MIN(paper_id) FROM paper) 的记录了。
W_hale 2018-09-04
  • 打赏
  • 举报
回复
引用 2 楼 ACMAIN_CHM 的回复:
((SELECT MAX(paper_id) FROM paper)-(SELECT MIN(paper_id) FROM paper)) * RAND() + (SELECT MIN(paper_id) FROM paper)

你的最大,最小 中间记录多吗?如果多,则应该问题不大。

因为测试数据不多,所以出现问题,意思就是如果多的话就可以忽略不计是吗,那这个问题有没有更好的解决方式?
ACMAIN_CHM 2018-09-03
  • 打赏
  • 举报
回复
((SELECT MAX(paper_id) FROM paper)-(SELECT MIN(paper_id) FROM paper)) * RAND() + (SELECT MIN(paper_id) FROM paper)

你的最大,最小 中间记录多吗?如果多,则应该问题不大。
W_hale 2018-09-03
  • 打赏
  • 举报
回复
如果是这样的话,又该如何修改避免呢

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧