色々なサイトからガチャ(Gacha(くじ))イベント(キャンペーン)がしていますが、
そのようなシステムを作る方法を説明したいと思います。
まず、アイテム情報と当たる確率を設定するテーブルを作成しましょう。
そしてデータも登録しましょう。
CREATE TABLE dbo.tGachaItem
(
ItemID varchar(50)
,ItemRate float
)
INSERT INTO dbo.tGachaItem (ItemID, ItemRate) VALUES ('はずれ', 50)
INSERT INTO dbo.tGachaItem (ItemID, ItemRate) VALUES ('3等 : アイテム', 30)
INSERT INTO dbo.tGachaItem (ItemID, ItemRate) VALUES ('1等 : アイテム', 1)
INSERT INTO dbo.tGachaItem (ItemID, ItemRate) VALUES ('2等 : アイテム', 20)
上記のようにアイテムと確率を設定しました。
確率合計が100ではなくても問題ありません。
次のSQLを一括で実行してみてください。
DECLARE @RateSum float
SELECT @RateSum = SUM(ItemRate) FROM dbo.tGachaItem WITH (NOLOCK)
DECLARE @Rand float
SELECT @Rand = CONVERT(float,RAND() * @RateSum)
CREATE TABLE #ItemRate
(
Idx int identity(1,1)
,ItemID varchar(50)
,ItemRate float
)
INSERT INTO #ItemRate
SELECT ItemID, ItemRate
FROM dbo.tGachaItem WITH (NOLOCK)
ORDER BY ItemRate, ItemID
DECLARE @ItemID varchar(50)
SELECT TOP 1 @ItemID = A.ItemID
FROM #ItemRate A WITH (NOLOCK)
INNER JOIN #ItemRate B WITH (NOLOCK)
ON A.Idx >= B.Idx
GROUP BY A.ItemID,A.ItemRate
HAVING SUM(B.ItemRate) >= @Rand
ORDER BY A.ItemRate
SELECT @ItemID AS [当たりアイテム]
DROP TABLE #ItemRate
設定した確率のとおりアイテムが当たると思います。
使い方の説明でしたので、どのように動くのかについては一つ一つSQLを確認しながら理解しましょう。