【问题标题】:SQL ORDER BY works with custom "comparators"?SQL ORDER BY 与自定义“比较器”一起使用?
【发布时间】:2013-04-14 19:28:52
【问题描述】:

为了获得表格内容的随机“排列”,一个选项是:
ORDER BY RAND()

我的问题是在这种情况下这是如何工作的?它调用RAND() 用作“比较器”? RAND 不带任何参数进行比较难道不重要吗?

【问题讨论】:

    标签: mysql sql sorting sql-order-by


    【解决方案1】:

    rand() 函数,在 MySQL 中,每次调用都会返回一个随机值。

    在这个过程中发生的事情是排序例程读取记录,调用 rand 函数,并隐式地将具有随机值的列添加到记录中。此列是隐藏的——您永远看不到它,但它用于排序。

    从逻辑上讲,这相当于:

    select <columns in t>
    from (select t.*, rand() as ordering
          from t
         ) t
    order by ordering
    

    【讨论】:

    • 关于ORDER BY 的文档在哪里?另一个示例函数是什么?
    • @Cratylus 。 . .我在 MySQL 文档中找不到对 order by 中表达式的具体引用。这个解释是我对 order by 子句中表达式的 ANSI 标准的回忆。
    • 那么当有人试图创建元素的随机“排列”时,怎么会知道这是ORDER BY 的“特征”?
    • 一般原则是order by 子句(或group by)中的表达式变成由表达式填充的“不可见”列。在 MySQL 中,rand() 为每一行返回不同的值,所以这是可行的。在其他数据库(例如 SQL Server)中,rand() 为整个查询返回一个值——您不会得到随机排列。 “功能”是rand() 函数的功能,而不是order by
    【解决方案2】:

    RAND()

    返回 0

    你可以提供一个可选的seeding value

    在执行时,这被视为virtual columnrandom numbersSQL engine 然后使用此列来sort 表内容,将其(动态列)视为任何普通列(具有浮点值)

    【讨论】:

    • 关于ORDER BY 的文档在哪里?另一个示例函数是什么?
    • 记录在 MySQL 文档中 SELECT syntax 见:ORDER BY {col_name | expr | position}
    【解决方案3】:

    RAND() 返回随机浮点数,因此使用标准浮点数比较来比较这些值。就像您在表模式中有一个浮点数列并在 ORDER BY 语句中使用它。这里没有魔法。

    【讨论】:

      猜你喜欢
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多