【问题标题】:SELECT range of integers in MySQL. Eg. 1,2,3,4,...,n;SELECT MySQL 中的整数范围。例如。 1,2,3,4,...,n;
【发布时间】:2010-12-08 10:26:16
【问题描述】:

我需要在 MySQL 中选择整数范围。像这样的

SELECT RANGE(10,20) AS range;

返回

10, 11, 12, 13, 14, ..., 20

为什么?
我想从尚未注册的范围中选择随机电话号码。这是个主意。

SELECT RANGE(100000,999999) AS range FROM phone WHERE phoneNum <> range LIMIT FLOOR(100000 + RAND()*(899999);

【问题讨论】:

  • 为什么不在使用 SQL 查询的程序中做呢?
  • 它是否总是需要返回一个电话号码,或者您希望能够一次选择 1000 个新电话号码?你在某个地方有一张“已经给出”电话号码的表格吗?

标签: mysql range sequence


【解决方案1】:

您的查询有问题:

  1. 您不能在 WHERE 子句中使用range。它是一个别名,只有在 WHERE 子句执行后才会定义。
  2. 即使您可以使用它,使用<> 将一个数字与一组数字进行比较也是没有意义的。一般来说,您可以使用IN(...),但在您的特殊情况下,您应该使用BETWEEN 100000 and 999999 并避免使用RANGE 函数。
  3. 如果您只想要一个数字,那么限制应该是 1,而不是随机数。通常选择你使用ORDER BY RAND()的随机项目。

尝试使用此查询:

SELECT phoneNum, 100000 as rangeStart, 999999 AS rangeEnd
FROM phone
WHERE phoneNum NOT BETWEEN 100000 AND 999999
ORDER BY RAND()
LIMIT 1

如果您想找到一个不在您的表格中的数字并且可用的数字没有接近耗尽(比如分配了不到 80%),那么一个好的方法是生成随机数并检查它们是否被分配,直到您找到一个不是。

可能存在纯 MySQL 解决方案,但我认为它需要一些扭曲连接、随机连接和模数连接。

【讨论】:

  • 该查询不会返回现有电话号码吗?他想返回表中不存在的范围内的随机值,即SELECT number FROM RANGE(100000,999999) WHERE NOT EXISTS (SELECT phoneNum FROM phone WHERE phoneNum = number) ORDER BY RAND() LIMIT 1 - 如果RANGE 动态生成了一个数字表
  • @Rup 既然你这么说,它确实有道理。直到现在我才明白这个要求。
  • @Rup 我认为动态生成这类表格效率不高。
  • 当然——我没想到它实际上会生成一个完整的临时数字表,我认为它会以某种方式得到优化。
  • @Rup 我发布了另一个使用永久数字表的答案。
【解决方案2】:

另一种选择:

首先创建一个只有数字的表,其中包含从 1 到 MAX_NUM 的所有数字。

然后使用这个查询:

SELECT n.id as newNumber
FROM numbers AS n
LEFT JOIN phone AS p
    ON p.phoneNum = n.id
WHERE 
    p.phoneNum IS NULL AND
    n.id BETWEEN lowerLimit AND upperLIMIT    
ORDER BY RAND()
LIMIT 1

这样你也可以通过改变限制值​​比较快地得到多个数。

【讨论】:

    猜你喜欢
    • 2022-11-18
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    相关资源
    最近更新 更多