2017-03-15 6 views
0

私は、特別なアイテムであるデータを含むmysqlテーブルを作成しようとしています。 、ITEM2(chanse:1)、項目(チャンス:20%)と ITEM3(チャンス:20):たとえば、私たちはITEM1(1 chanse)持っているなど。など... - チャンスは%テーブルからランダムなアイテムを選択する

でありますだから私は、次の情報を持つテーブルを作成しました:

CREATE TABLE `special_items` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `item_id` int(11) NOT NULL, 
    `item_name` varchar(255) DEFAULT NULL, 
    `item_type` enum('SPECIAL','SILVER','BRONZE','GOLD') NOT NULL DEFAULT 'BRONZE', 
    `item_ratio` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id` (`id`) USING BTREE, 
    UNIQUE KEY `item` (`item_id`) USING BTREE 
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; 

-- ---------------------------- 
-- Records of special_items 
-- ---------------------------- 
INSERT INTO `special_items` VALUES ('1', '200', 'special_name1', 'BRONZE', '80'); 
INSERT INTO `special_items` VALUES ('2', '204', 'special_name2', 'BRONZE', '4'); 
INSERT INTO `special_items` VALUES ('3', '875', 'special_name3', 'BRONZE', '80'); 
INSERT INTO `special_items` VALUES ('4', '900', 'special_name4', 'BRONZE', '60'); 
INSERT INTO `special_items` VALUES ('5', '901', 'special_name5', 'SILVER', '90'); 
INSERT INTO `special_items` VALUES ('6', '968', 'special_name6', 'BRONZE', '65'); 
INSERT INTO `special_items` VALUES ('7', '777', 'special_name7', 'BRONZE', '30'); 

私たちが今やりたいことがあっ比で800行5つのランダムな項目から選択しています。したがって、次の要件が必要です。

  • 常にランダムな行。
  • 選択行が存在比(表中のチャンスは、例えばパーセントである)

私もほとんどのソリューションをフィットこのクエリを見つけましたが、その私は、ランダムな比率のためにこれを行うだろうか分かりません(パーセンテージ)

SELECT item_name 
    FROM special_items AS r1 JOIN 
     (SELECT CEIL(RAND() * 
        (SELECT MAX(id) 
         FROM special_items)) AS id) 
     AS r2 
WHERE r1.id >= r2.id 
ORDER BY r1.id ASC 
LIMIT 5 

これはPHPを使用して行うことができればすばらしいでしょう。

私はすべての提案を受け付けています。私はその間に私自身もこれを理解しようとしていますが、私はまだ固執しています。

+0

サンプルデータと予想される出力を表示します。 \t [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [**スタート**] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を改善し、より良い回答を得る方法を学ぶことができます。 –

+0

チャンスは何を意味しますか?例えば、1を加算しません。テーブルには何行あり、どれだけ選択されていますか?これはランダムなサブセットかスーパーセットですか? –

+0

5項目をランダムに選択するのは簡単ですが、比率の制限が明確ではありません。 –

答えて

0

"chanse" [sic]とは、各行に重みがあることを意味し、この重みが行が選択される確率に寄与したいと思っています。

1つの方法は、各行に対して乱数を生成し、重みを掛けて生成された最高の5行を返す方法です。あなたが偶然に何を意味するのか不明であるので、これはあなたがやりたいことがあります

select si.* 
from (select si.*, rand() * item_ratio as weight 
     from special_items si 
    ) si 
order by weight desc 
limit 5; 

注:weightだけ行ごとに一度計算されるようにサブクエリが必要とされています。私はこれが同じことをすると思います:

select si.*, rand() * item_ratio as weight 
from special_items si 
order by weight desc 
limit 5; 

しかし、MySQLは独特のものです。

+0

例: 項1から20パーセント 項目4この行を取得するためのチャンス - - この行3% 項目3を得るためのチャンス - この行1% アイテム2を取得するためのチャンスチャンスをこの行を取得する25% 項目5 - この行を取得する確率90% 項目6 - この行を取得する確率25% 制限は、ランダム選択と行の取得の可能性に基づいて常に5行を取得することです。 @Gordon Linoff – Blacky

+0

@Blackyはこれであなたの問題を解決しませんでしたか? –

+0

関数RAND()を使ったのは、私があなたが関数randomによって何を知っていないのか知っていないからですか?あなたはそれを説明できますか? – Blacky

関連する問題