【发布时间】:2022-01-09 09:29:17
【问题描述】:
我正在尝试制作一个生成随机用户名的应用程序。我有一个简单的表,只有一个 ID 和一个名称列。基本上:
| id | name |
|---|---|
| 1 | dude |
| 2 | chill |
| ... | ... |
我想从那里选择 3 个随机值。这是我的尝试:
SELECT COUNT(id) INTO @count -- gets the length
FROM username_generator;
SELECT name FROM username_generator -- selects 3 names with random IDs
WHERE id IN (
(FLOOR(RAND() * @COUNT)+1),
(FLOOR(RAND() * @COUNT)+1),
(FLOOR(RAND() * @COUNT)+1)
);
思路是计算长度,在长度范围内选择3个ID。
问题是这有时会返回 NOTHING,我不知道为什么。随机数总是在范围内,我在表中有名字。例如:
正常:
不正常:
【问题讨论】:
-
你的
id有空缺吗?我的意思是你能保证MAX(id)等于COUNT(id),并且从1到max的每个连续值都被连续使用吗? -
我只有 15 个名字,因为我正在尝试,所以我可以 100% 保证。
-
您知道计数,但这并不能保证没有间隙。试试
SELECT MIN(id), MAX(id), COUNT(id) from username_generator,确认最小值为1,最大值和计数相等。 -
你也可以试试这个:
SELECT r.id, name FROM (SELECT FLOOR(RAND() * @COUNT)+1 AS id UNION SELECT FLOOR(RAND() * @COUNT)+1 UNION SELECT FLOOR(RAND() * @COUNT)+1) AS r LEFT OUTER JOIN username_generator USING (id);运行几次,看看你是否有时会得到 NULL 的名字。 -
MIN 为 1,MAX 和 COUNT 相同。我已经将您的解决方案运行了 10 次,它似乎正在运行。感谢您的帮助。