ランダムな項目プロパティを取得したい項目プロパティのテーブルがありますが、そのランダム性を他の項目プロパティよりもいくつかの項目プロパティに傾かせたいと考えています。
これを達成するために、そのアイテムが表示される頻度 (より高い = より頻繁) を格納するrarityという列と、次のクエリを使用して構成されたrarity_positionという列をセットアップしました。
SET @i:=0;UPDATE itemproperty SET rarity_position = @i:=@i+rarity;
これにより、次の結果が得られます。
次に、ランダムな値を取得するために、次を使用すると思いました。
SELECT * FROM itemproperty
WHERE id = (
SELECT id
FROM itemproperty
WHERE rarity_position >= FLOOR
(
RAND()*
(
SELECT MAX(rarity_position) FROM itemproperty
)
)
ORDER BY rarity_position
ASC LIMIT 1
) LIMIT 1
最高の rarity_position の最大値を持つ乱数を選択するには、そのすぐ上にある rarity_position を持つ item プロパティを取得します。
ほとんどの場合、これは期待どおりに機能しますが、約 3 分の 1 の場合、結果が返されません。
おそらく関連するサーバー情報:
Software: MySQL
Software version: 5.0.95-log - MySQL Community Server (GPL)
Protocol version: 10
Server charset: UTF-8 Unicode (utf8)
このモデルで動作を再現できます:
create table itemproperty (
id int, rarity int, rarity_position int
);
insert into itemproperty
values
( 1, 50, 50 ),
( 2, 50, 100 ),
( 3, 50, 150 ),
( 4, 50, 200 ),
( 5, 50, 250 ),
( 6, 50, 270 ),
( 7, 50, 320 ),
( 8, 50, 370 ),
( 9, 50, 420 ),
( 10, 50, 470 ),
( 11, 50, 520 )
;
サブクエリのみを実行しようとすると、毎回動作します:
SELECT id
FROM itemproperty
WHERE rarity_position >= FLOOR
(
RAND()*
(
SELECT MAX(rarity_position) FROM itemproperty
)
)
ORDER BY rarity_position
ASC LIMIT 1
しかし、それをカプセル化すると:
SELECT * FROM itemproperty
WHERE id = (
// here the above request
) LIMIT 1;
期待どおりに動作しません。
毎回結果が返されない原因は何ですか?