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 |
+----------------------------------------------------------+

求解答

个人理解,仅供参考:

img


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

【以下回答由 GPT 生成】

通过使用ORDER BY RAND()函数来随机选择较大的id值,然后通过子查询获取最大的id值作为过滤条件,以确保选取的id值较大。

以下是解决问题的步骤:

  1. 使用DESCRIBE命令查询表的结构,以确保id字段是连续且自增的。

  2. 执行以下查询语句,获取最大的id值:

    sql SELECT MAX(id) FROM `nickname_library`;

  3. 使用子查询和ORDER BY RAND()函数来随机选择较大的id值。将子查询的结果作为过滤条件,确保选取的id值较大。例如:

    sql SELECT * FROM `nickname_library` WHERE id >= ( SELECT FLOOR(RAND() * (SELECT MAX(id) FROM `nickname_library`)) ) ORDER BY RAND() LIMIT 10;

    注意:我们使用两次RAND()函数,一次用于计算过滤条件中的随机数,另一次用于ORDER BY RAND(),以确保结果是随机的。

通过上述步骤,你应该能够在MySQL中随机选择较大的id值。如果你需要更多的帮助,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^