如何使用PHP在数据库中重复生成随机数而不重复?

asl*_*tor 33 mysql

我想生成一个5位数字,不在数据库内重复.假设我有一个名为numbers_mst的表,其字段名为my_number.

我想以这个my_number字段中不重复的方式生成数字.此前允许前面的零.所以允许像00001这样的数字.另一件事是它应该在00001到99999之间.我怎么能这样做?

我可以猜到的一件事是我可能需要创建一个递归函数来检查表中的数字并生成.

Tus*_*har 52

SELECT FLOOR(RAND() * 99999) AS random_num
FROM numbers_mst 
WHERE "random_num" NOT IN (SELECT my_number FROM numbers_mst)
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

这是做什么的:

  1. 使用RAND()选择0 - 1之间的随机数.
  2. 将其放大为0 - 99999之间的数字.
  3. 仅选择表中尚不存在的那些.
  4. 仅返回1个结果.

  • 这不像你认为的那样工作.在它检查的where子句中,如果字符串"random_num"不在子查询的返回列表中......总是如此,因为my_number是数字.所以请:这不是您正在寻找的解决方案;) (14认同)
  • 它不起作用,请检查此示例SELECT FLOOR(RAND()*9)AS random_num FROM some_table WHERE"random_num"NOT IN(1,2,3,4,5,6,7,9)LIMIT 1 (12认同)
  • 非常好,虽然随着选项开始耗尽可能会很慢,但是可能会更快地预加载具有所有可能值的另一个表并从中选择由rand()排序,然后删除所选记录以便永远不会再次选择它. (6认同)
  • "random_num"是一个字符串而不是列名. (6认同)
  • 这个答案是**错误的**应该被删除,因为在它检查的where子句中,如果字符串"random_num"不在子查询的返回列表中. (6认同)
  • 这是有效的,也是天才的答案.我等着完成2分钟限制接受这个答案lolz :) (3认同)
  • 这看起来不像有效的sql。是吗? (2认同)
  • 答案不正确,“ random_num”是此处的文本,不是别名!并且您不能根据文档在where子句中使用别名。 (2认同)

Sti*_*ael 13

除了Tushar在numbers_mst为空时使其工作的答案:

SELECT random_num
FROM (
  SELECT FLOOR(RAND() * 99999) AS random_num 
  UNION
  SELECT FLOOR(RAND() * 99999) AS random_num
) AS numbers_mst_plus_1
WHERE `random_num` NOT IN (SELECT my_number FROM numbers_mst)
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

  • 这在某些情况下没有结果 (2认同)

Ben*_*ild 6

注意:当列配置为时,发布的其他解决方案才有效NOT NULL。如果为NULL,则不会返回任何结果。您可以像这样解决查询:

SELECT random_num
FROM (
  SELECT FLOOR(RAND() * 99999) AS random_num
) AS numbers_mst_plus_1
WHERE random_num NOT IN (SELECT my_number FROM numbers_mst WHERE my_number IS NOT NULL)
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

...这...WHERE my_number IS NOT NULL是必要的!

编辑:我只是想提一下,我故意删除了inner SELECT的表名,因为它没有必要,并且如果表中没有数据,似乎会中断?但是,也许这是故意包括在内的吗?—请为所有人澄清或发表评论,谢谢。

  • 您的工作原理很不错,它可以实际获取一个未使用的随机数。但是,尝试一个小的数据集。如果选择的兰特存在,则不返回任何内容。 (4认同)