【问题标题】:MySQL random select doesn't return anythingMySQL随机选择不返回任何内容
【发布时间】: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 次,它似乎正在运行。感谢您的帮助。

标签: mysql select random


【解决方案1】:

问题是 id 范围内可能存在间隙。

解决这个问题的最简单方法,实际上也是最简单的解决方案,是忘记使用 count 并随机选择 3 个名称,如下所示:

select name
from username_generator
order by rand()
limit 3

请参阅live demo(刷新演示页面以查看每次运行查询时返回的不同名称)。

【讨论】:

    猜你喜欢
    • 2014-09-01
    • 1970-01-01
    • 2013-08-27
    • 2017-12-28
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多