Mysql 如何使用HAVING子句使用RAND()别名
试图生成唯一的代码以防止重复,我使用以下查询using HAVING子句,这样我就可以使用别名,但会出现重复的密钥错误: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()
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回答了,我认为这可能是可能的,但正如你所说的,它不是。无论如何,谢谢你。