ORDER BY如何与MySQL中的单值表达式一起使用?

时间:2012-02-28 09:11:16

标签: mysql sql sql-order-by

我对order by有疑问。我们知道如果我们按顺序给出整数,那么它通过列的索引进行排序。当我每次执行查询时都这样使用它,我得到相同的结果,这是正确的。

但是当我将这个值作为表达式的结果时(我的意思是我使用总是计算为1的表达式),那么当我执行它时,我得到3个可能的结果组合。

因此对于相同的静态值,相同的结果;但对于相同的值,这是一个评估表达式,结果不同。

以下是我所指的查询示例:

SELECT SomeColumns, (rand()* 10) as rand
FROM TableName
ORDER BY (if ((rand in (1) ), 1,1))
LIMIT 0 , 6

上述查询提供了三种可能的结果集。

3 个答案:

答案 0 :(得分:1)

查看SELECT语句语法; ORDER BY子句定义为:

  

ORDER BY {col_name | expr |位置}

稍后在此页面上提到:

  

列位置是整数,以1

开头

按列位置排序,当它被指定为整数 literal 时,按预期工作。在您的情况下,ORDER BY (if ((rand in (1) ), 1,1))是表达式,而不是列位置。它的工作原理如下:

  • rand列将添加到包含介于0.0和9.9999之间的值的所有行...
  • 对每行评估表达式if(rand in (1), 1, 1),如下所示:
    • 子表达式rand in (1)几乎总是返回false,因为rand列恰好为1的可能性非常非常非常低
    • 根据前面的表达式,IF条件的计算结果为1或1(可能是代码中的拼写错误)
    • 整个表达式的评估结果为每行1
  • 由于ORDER BY子句中的表达式为每行产生1,因此行不会被排序

答案 1 :(得分:1)

ORDER BY的{​​{3}}是:

ORDER BY {col_name | expr | position} [ASC | DESC], ...

虽然人眼看来以下是相同的:

ORDER BY 1
ORDER BY (if ((rand in (1) ), 1,1))

他们不是。

  • 第一个按1 st列的数据排序,因为它是一个值为1的整数。

  • 第二个虽然评估为1,但它不是整数而是表达式,因此,调用不同的排序机制。对于每一行,计算表达式1并用于确定行的位置;因为你的表达式实际上根本没有引用行数据,所以你的结果将是完全不可预测的。

    你是否会获得表格的“自然顺序”(即关系抽象下面恰好存在的物理排序)或ORDER BY所创建的一些随机顺序我不能说,但也没关系。

通常你会为表达式写这样的东西:

ORDER BY `col` % 6

...即引用数据的东西。

答案 2 :(得分:0)

ORDER BY (if ((rand in (1) ), 1,1))

它根据表达式对结果集进行了排序。对于动态值,它还会根据您的order by表达式

重新排序