2

次のクエリがあります。

SELECT (RAND() * (SELECT MAX(id) FROM frag.test))

結果: -2.36835027969671e+18
id は: idbigint(20) unsigned

物事はそれです

SELECT MAX(id) FROM frag.test

15783548581713655808 の結果

そして、選択の代わりにリテラル番号を配置すると、機能します

SELECT (RAND() * 15783548581713655808

1.50243050315076e+19 の結果

また、次のクエリ:

SELECT RAND()*id from frag.test;

結果:

+----------------------+
| RAND()*id            |
+----------------------+
| 2.90739099802377e+18 |
| 3.18790581714312e+18 |
| 4.55299756382674e+18 |
| 8.53310890373737e+18 |
| 5.32382972831492e+18 |
| 1.13192831652015e+19 |
+----------------------+

この問題は、MAX() が使用されている場合にのみ発生するようです。

ここで何が起こっているのか考えている人はいますか?

ありがとうございました!

編集:

cogeが指摘したように、これはキャスティングと関係があります。クエリを次のように変更しました

SELECT (RAND() * (SELECT cast(MAX(id) as decimal(30,10)) FROM frag.test));

そして今、期待どおりに動作します!

4

1 に答える 1

1

データ型に問題がある可能性があると思います。Rand() は浮動小数点値を返します。私は MySQL の専門家ではありませんが、浮動小数点が継承して int に変換されるかどうかは疑問です。

Rand() の結果を int に変換するか、bigint を float または decimal に変換してみてください。

于 2012-10-26T18:30:22.537 に答える