1

我正在尝试从 MySQL 中的查找表中随机选择名字来构建测试数据集。我有一个包含 200 个名字、性别和从 1 到 200 的行 ID 的表。像这样:

id   firstname   gender
1    Aaron       m
2    Adam        m
3    Alan        m
etc...

我正在使用具有以下查询的随机生成器从该表中进行选择:

SELECT id, firstname FROM firstname WHERE id = round(1 + (rand() * 199));

我期望随机数与查找表中的一个 id 完全一致,从而产生一个单一的结果,例如

id   firstname
43   Jason

一次又一次地运行代码给了我一个选择

  • 单行(如上)
  • 或多行,如

id firstname 29 Ethan 147 Jean

  • 没有结果(两个字段都为 NULL)。

如果我自己运行随机生成器,它总是会生成一个介于 1 和 200 之间的数字。如下所示,id 字段是 INT,如果我将结果转换为 SIGNED,则查询的行为方式相同。我也尝试使用 FLOOR 而不是 ROUND,只是想看看它是否有任何不同 - 唉,不。

谁能告诉我为什么异常?我错过了什么?

下面是一些用于创建原始表的前 20 行的代码,用于测试目的:

-- First Name --
drop table if exists firstname;

  CREATE TABLE firstname (
  id INT NOT NULL,
  firstname VARCHAR(20) NOT NULL,
  gender VARCHAR(1) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE (firstname)
  );

  INSERT INTO firstname
  (id,firstname,gender)
  VALUES
  (1,"Aaron","m"),
(2,"Adam","m"),
(3,"Alan","m"),
(4,"Albert","m"),
(5,"Alexander","m"),
(6,"Andrew","m"),
(7,"Anthony","m"),
(8,"Arthur","m"),
(9,"Austin","m"),
(10,"Benjamin","m"),
(11,"Billy","m"),
(12,"Bobby","m"),
(13,"Brandon","m"),
(14,"Brian","m"),
(15,"Bruce","m"),
(16,"Bryan","m"),
(17,"Carl","m"),
(18,"Charles","m"),
(19,"Christian","m"),
(20,"Christopher","m");
4

1 回答 1

0

由于RAND()不是确定性的,WHERE 条件每行评估/执行一次。因此,每一行有 1/199 的机会被选中。您可以在 FROM 子句(派生表)中使用子查询来生成一个随机数:

SELECT f.id, f.firstname
FROM firstname f
JOIN (SELECT floor(rand()*200)+1 as rnd) r ON r.rnd = f.id
于 2018-06-19T16:36:07.767 回答