如何使用RAND()别名使用HAVING子句

时间:2013-01-24 02:04:19

标签: mysql having-clause

尝试生成唯一代码以防止重复我使用HAVING子句使用以下查询,因此我可以使用别名但我得到重复的键错误:

SELECT
  FLOOR(100 + RAND() * 899) AS random_code 
FROM product_codes 
HAVING random_code NOT IN (values) 
LIMIT 1

以下代码不起作用,是我需要的:

https://stackoverflow.com/a/4382586

有没有更好的方法来实现这一点,或者我的查询中出现了问题?

2 个答案:

答案 0 :(得分:2)

如果您想要保证唯一的唯一代码,请使用mySQL函数UUID()

http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid

“UUID被设计为在空间和时间上全局唯一的数字。对UUID()的两次调用预计会生成两个不同的值,即使这些调用是在两个未连接到每个的独立计算机上执行的其他“。

如果UUID太长(例如,它必须是一定数量的数字),则对UUID进行散列(例如,使用md5或sha-256),取一定数量的位并将其转换为小数整数。散列非常重要,因为整个UUID保证了唯一性,而不是任何一部分。 但是,您现在可以获得哈希冲突,只要您有超过sqrt(2 ^位)的条目,就可能发生哈希冲突。例如。如果你使用10比特作为0-1023,那么在大约32个条目之后,哈希冲突很可能发生。如果使用这几位,请考虑使用递增序列。

答案 1 :(得分:0)

想要使用MYSQL查询来获取0-999之间的随机数作为代码但是尝试了该查询并且我结束了填充值条件从0到999仍然总是重复代码,奇怪的行为所以我最终使用PHP。

我现在使用的步骤:

创建一个填充0到999的数组,将来如果我需要更多代码将使用0到9999。

$ ary_1 =数组(0,1,2,....,999)

创建填充表中所有代码的其他数组。

$ ary_2 = array(4,5,985,963,589)

使用array_diff获取结果数组。

$ ary_3 = array_diff($ ary_1,$ ary_2)

从结果array_diff中使用array_rand获取数组键。

$ new_code_key = array_rand($ ary_3,1)

使用该密钥获取代码并创建MYSQL查询。

$ ary_3 [$ new_code_key]

取消设置新代码数组中的那个键,这样我就可以加快进程速度,只需要得到更新的array_rand键,然后再取消设置。

未设置($ ary_3 [$ new_code_key])