【问题标题】:How to use HAVING clause using RAND() alias如何使用 RAND() 别名使用 HAVING 子句
【发布时间】:2013-01-07 16:48:15
【问题描述】:

尝试生成唯一代码以防止重复我使用 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

是否有更好的方法来完成此操作,或者我的查询有问题?

【问题讨论】:

  • 您的values 中有什么内容?
  • 我使用以下查询生成值:SELECT codes FROM product_codes 就在我调用 HAVING 查询并使用 PHP 内爆函数之前,我得到以下结果(0、258、365、789、563、693)
  • 为什么在原始查询中提到product_codes?没有使用该表中的任何内容!

标签: mysql having-clause


【解决方案1】:

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

我现在使用的步骤:

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

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

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

$ary_2 = 数组(4, 5, 985, 963, 589)

使用 array_diff 获取结果数组。

$ary_3 = array_diff($ary_1, $ary_2)

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

$new_code_key = array_rand($ary_3, 1)

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

$ary_3[$new_code_key]

从新的代码数组中取消设置该键,因此我加快了进程,只需要获取另一个 array_rand 键并稍后取消设置。

未设置($ary_3[$new_code_key])

【讨论】:

    【解决方案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^bits) 个条目时立即发生。例如。如果您使用 10 位来表示 0-1023,那么在大约 32 个条目之后,可能会发生哈希冲突。如果您使用这几位,请考虑使用递增序列。

    【讨论】:

    • 我确实知道如何获取唯一 ID,但我的目标是使用单个 mysql 查询来获取 0 到 999 之间的代码,因此表中还没有一个三位数,但是感谢您的尝试。
    • 如果有一个解决方案不需要生成值并检查表直到你得到一个不在其中的值,我会感到非常惊讶。它似乎非常非 SQL-y。
    • 我也是,如果它可以使用 MYSQL 在一个查询中完成,我会感到非常惊讶,但是因为我发现 Q 回答了我认为它可能是可能的,但正如你所说的那样不是。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    相关资源
    最近更新 更多