那些只需要它进行低精度的自然排序(小数后一位小数,并且只精确到小数点后 4 位)但性能良好的人可以使用:
( (length(count(*) * 1000 / 1000) + length(count(*) * 1258 / 1000) + length(count(*) * 1584 / 1000) + length(count(*) * 1995 / 1000) + length(count(*) * 2511 / 1000) + length(count(*) * 3162 / 1000) + length(count(*) * 3981 / 1000) + length(count(*) * 5011 / 1000) + length(count(*) * 6309 / 1000) + length(count(*) * 7943 / 1000)) / 10.0 - 1.0 )
我在一个连接中需要它,我对连接的 n:m 表中的条目数的日志感兴趣,因此我使用了“count(*)”,我计算了它的对数。
... ( ( ( ( (0.0 + length(count(*) * 1000 / 1000) + length(count(*) * 1258 / 1000) + length(count(*) * 1584 / 1000) + length(count(*) * 1995 / 1000) + length(count(*) * 2511 / 1000) + length(count(*) * 3162 / 1000) + length(count(*) * 3981 / 1000) + length(count(*) * 5011 / 1000) + length(count(*) * 6309 / 1000) + length(count(*) * 7943 / 1000)) / 10.0 - 1.0 ) * 10 +1 ) + ( IFNULL(stat.sum * 1.0 / (1848) , 0.9999999) ) ) / ( IFNULL(stat.count,1) + ( ( (0.0 + length(count(*) * 1000 / 1000) + length(count(*) * 1258 / 1000) + length(count(*) * 1584 / 1000) + length(count(*) * 1995 / 1000) + length(count(*) * 2511 / 1000) + length(count(*) * 3162 / 1000) + length(count(*) * 3981 / 1000) + length(count(*) * 5011 / 1000) + length(count(*) * 6309 / 1000) + length(count(*) * 7943 / 1000)) / 10.0 - 1.0 ) *10 +1 ) ) ) as rating, stat.expl as expl from ...
可以使用任何其他整数变量代替 'count(*)',只要确保它是整数,或者将其转换为整数。浮动的长度显然对你没有任何好处。
这是一个肮脏的技巧,它使用了一个事实,即 int 的十进制表示的字符串的长度由对数定义,并提取它。但是与计算浮点数的所有数字的对数实现相比,将 int 转换为字符串并计算长度似乎是相当有效的,除了精度只有一位小数的缺点。我能用可移植的 sqlite 语法做的最好。
PS:如果有人对如何提高精度、性能或具有可变对数基数有任何想法(而不是将其固定为以 10 为基数的第一个小数位),请发表评论。
PPS:http ://sqlfiddle.com/#!7/9aadc/2/0