Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用HAVING子句使用RAND()别名_Mysql_Having Clause - Fatal编程技术网

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

Mysql 如何使用HAVING子句使用RAND()别名,mysql,having-clause,Mysql,Having Clause,试图生成唯一的代码以防止重复,我使用以下查询using HAVING子句,这样我就可以使用别名,但会出现重复的密钥错误: SELECT FLOOR(100 + RAND() * 899) AS random_code FROM product_codes HAVING random_code NOT IN (values) LIMIT 1 以下代码不起作用,我需要它: 有没有更好的方法来实现这一点,或者我的查询有问题?如果您想要一个保证唯一的代码,请使用mySQL函数UUID()

试图生成唯一的代码以防止重复,我使用以下查询using HAVING子句,这样我就可以使用别名,但会出现重复的密钥错误:

SELECT
  FLOOR(100 + RAND() * 899) AS random_code 
FROM product_codes 
HAVING random_code NOT IN (values) 
LIMIT 1
以下代码不起作用,我需要它:


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

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

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


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

< P>希望使用MySQL查询将0到999之间的随机数作为一个代码来获取,但是尝试了该查询,并且结束了从0到999填充值条件,并且仍然得到重复代码,奇怪的行为,因此我最终使用了PHP。 我现在使用的步骤是:

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

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

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

$ary_2=数组(4,5985963589)

使用array_diff获取结果数组

$ary_3=数组_diff($ary_1,$ary_2)

使用结果数组_diff中的数组_rand获取数组键

$new\u code\u key=array\u rand($ary\u 3,1)

使用该键获取代码并创建MYSQL查询

$ary_3[$new_code_key]

从新的代码数组中取消设置该键,这样我就加快了过程,只需获得另一个数组的随机键,然后再取消设置


unset($ary_3[$new_code_key])

您的
值中有什么?我通过以下查询生成值:
从产品代码中选择代码
就在我调用HAVING查询并使用PHP内爆函数之前,我得到以下结果(0、258、365、789、563、693)为什么在原始查询中提到
产品代码
?那张桌子上什么也没用!我确实知道如何获得唯一的ID,但我的目标是使用一个mysql查询来获得0到999之间的代码,因此表中还没有一个三位数的数字,但感谢您的尝试。如果有一个解决方案不需要生成值并检查表中的值,直到您得到一个不在其中的值,我会非常惊讶。它看起来非常非SQL-y.Me,如果它可以在一个使用MYSQL的查询中完成,我会感到难以置信的惊讶,但是因为我发现Q回答了,我认为这可能是可能的,但正如你所说的,它不是。无论如何,谢谢你。