为什么不是IN没有工作

时间:2015-04-10 07:07:14

标签: mysql

最初,我想为用户创建某种id,但由于某些原因,我无法将我的数据表更改为unique。所以我必须手动生成唯一的随机数据,所以我决定这样做:

SELECT CONCAT("B",FLOOR(10000 + RAND() * 89999)) AS random_number
FROM mmr
WHERE "random_number" NOT IN (SELECT rm FROM mmr) LIMIT 1

FLOOR(10000 + RAND() * 89999)我能够获得10000-99999之间的随机数据,但它仍然不是唯一的。

mmr是一个包含2M以上数据的大表,rm类型为varchar(12)。我期待的结果是Bxxxxx

我也尝试使用not exists,但

中没有结果

3 个答案:

答案 0 :(得分:1)

您尝试通过在SELECT子句中引用其random_number别名来引用WHERE部分中随机生成的值。没有办法。同样,由于您的random_number条件,您可能会将NULLNOT IN字段进行比较。这将评估为NULL(或有效FALSE)。

你可以尝试:

SELECT random_number
FROM (
    SELECT CONCAT("B",FLOOR(10000 + RAND() * 89999)) AS random_number
    FROM mmr
) t
WHERE t.random_number NOT IN (
    SELECT rm
    FROM mmr
    WHERE rm IS NOT NULL
)
LIMIT 1

现在,内部查询将生成与mmr中的记录一样多的随机数,但在该查询中可能已经是重复的。之后,mmr已经的任何数字都会被过滤掉,从而使您的随机数少于mmr中的记录。

(我在here on SO时询问了 'B' NOT IN ('A', NULL) ,并得到了一些很好的解释说明。

答案 1 :(得分:0)

试试这个:

SELECT CONCAT("B",FLOOR(10000 + RAND() * 89999)) AS random_number
FROM mmr
WHERE random_number NOT IN (SELECT rm FROM mmr WHERE rm IS NOT NULL)

编辑:为什么“限制1”在您的代码中?我删除了它,在这种情况下没用。它可能是你问题的原因,因为它只需要一条记录

答案 2 :(得分:0)

您可以将CROSS JOIN与查询结合使用,并检查表格行中是否存在random_number

SELECT random_number
FROM mmr
CROSS JOIN (SELECT CONCAT("B",FLOOR(10000 + RAND() * 89999)) AS random_number) rmt
WHERE random_number <> rm AND rm IS NOT NULL
LIMIT 1