精度が低く(小数部の小数点以下1桁で四捨五入され、小数点以下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の10進表現の文字列の長さが対数で定義されているという事実を使用して、それを抽出するという汚いトリックです。しかし、floatのすべての桁を計算するlogorithm実装と比較すると、整数から文字列への変換と長さのカウントは、小数点以下1桁しかないという欠点を除けば、かなり効率的であるように思われます。ポータブルsqlite構文でできる最善のこと。
PS:精度、パフォーマンスを改善する方法、または可変対数ベース(10を底とする小数点以下第1位に切り捨てられるように固定されるのではなく)を使用する方法について誰かがアイデアを持っている場合は、コメントしてください。
PPS:http ://sqlfiddle.com/#!7/9aadc/2/0