2

ランダムな項目プロパティを取得したい項目プロパティのテーブルがありますが、そのランダム性を他の項目プロパティよりもいくつかの項目プロパティに傾かせたいと考えています。

これを達成するために、そのアイテムが表示される頻度 (より高い = より頻繁) を格納する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;

期待どおりに動作しません。

毎回結果が返されない原因は何ですか?

4

2 に答える 2

2
SELECT *
FROM itemproperty 
ORDER BY RAND() * rarity DESC
LIMIT 1
于 2012-11-29T22:16:21.013 に答える
0

zerkms メソッドに似た実行可能なソリューションが見つかりました。

ORDER BY -LOG(1.0 – RAND()) / rarity

ソース

特に、欠落している部分は、次の質問に関連しているように思われます: MySQL query with RAND() subquery condition

WHERE に RAND() があると、奇妙なことが起こると思います。

于 2012-12-02T04:06:45.333 に答える