ToSee the dawn 2023-08-21 16:13 采纳率: 33.3%
浏览 7

MySQL的随机选出的id值很小

我在尝试随机取出mysql中的一条数据中

DESCRIBE nickname_library;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | NO   | UNI | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

以下用来证明字段id是连续且自增的:

SELECT MIN(id), MAX(id), COUNT(*) FROM `nickname_library`;
+---------+---------+----------+
| min(id) | max(id) | count(*) |
+---------+---------+----------+
|       1 |    2415 |     2415 |
+---------+---------+----------+

但是我尝试执行:

SELECT * FROM `nickname_library`
WHERE id >= (
    SELECT FLOOR(RAND() * (SELECT MAX(id) FROM `nickname_library`))
) 
ORDER BY id LIMIT 10;
+-----+-----------------------+
| id  | name                  |
+-----+-----------------------+
|  36 | 青衫不改旧人还        |
|  63 | 和晨濡                |
|  80 | 倦怠                  |
|  86 | 勉励                  |
|  92 ||
| 148 | 超越                  |
| 160 | 叶觞彡                |
| 167 | 装乖很简单            |
| 208 | 安知                  |
| 224 | 沐樱                  |
+-----+-----------------------+

这里的id居然不是连续的,而且我试了很多次,选出来的id一直没有超过300
可是我的数据一共有2415条数据
但是我单独执行:

SELECT FLOOR(RAND() * (SELECT MAX(id) FROM `nickname_library`));

选出的数据又是很平均的

+----------------------------------------------------------+
| FLOOR(RAND() * (SELECT MAX(id) FROM `nickname_library`)) |
+----------------------------------------------------------+
|                                                      451 |
+----------------------------------------------------------+
+----------------------------------------------------------+
| FLOOR(RAND() * (SELECT MAX(id) FROM `nickname_library`)) |
+----------------------------------------------------------+
|                                                     1912 |
+----------------------------------------------------------+
+----------------------------------------------------------+
| FLOOR(RAND() * (SELECT MAX(id) FROM `nickname_library`)) |
+----------------------------------------------------------+
|                                                      965 |
+----------------------------------------------------------+

求解答

  • 写回答

2条回答 默认 最新

  • 一只小阿焜 2023-08-21 16:59
    关注

    个人理解,仅供参考:

    img


    如图所示,按照你的逻辑的话,应该只会产生一个数值,但是rand()会被计算多次,所以产生了四个值,至于为什么rand()会被执行多次,可以参考下面这个文章
    https://www.coder.work/article/3997356

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 8月21日

悬赏问题

  • ¥20 求一个手机号或者Wxid转微信号的工具
  • ¥20 msconfig开启安全引导后重启电脑黑屏
  • ¥15 对email表单做了一般邮箱正则校验,现在需要额外输入为hotmail或outlook、gmail时做特定邮箱校验,不符合提示出来。并且保证不影响其他正确的邮箱格式通过校验,通过不会提示。
  • ¥20 Win11,bitblocker密钥恢复失败
  • ¥15 stm32 cubemx配置sdram,初始化后无法读写sdram
  • ¥100 上位机到dtu再到485继电器模块 目前结束命令有百分之2左右概率执行失败求指导
  • ¥15 ifcopenshell库在vs2019下的配置
  • ¥15 whql认证的windows硬件开发者账号个人验证不匹配问题
  • ¥15 色彩分析仪sensor
  • ¥15 求网页搭建平台会的联系我