我对order by
有疑问。我们知道如果我们按顺序给出整数,那么它通过列的索引进行排序。当我每次执行查询时都这样使用它,我得到相同的结果,这是正确的。
但是当我将这个值作为表达式的结果时(我的意思是我使用总是计算为1的表达式),那么当我执行它时,我得到3个可能的结果组合。
因此对于相同的静态值,相同的结果;但对于相同的值,这是一个评估表达式,结果不同。
以下是我所指的查询示例:
SELECT SomeColumns, (rand()* 10) as rand
FROM TableName
ORDER BY (if ((rand in (1) ), 1,1))
LIMIT 0 , 6
上述查询提供了三种可能的结果集。
答案 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
表达式