我正在网站上举办比赛,我有3215名参赛者有资格获得5x索尼PSP。
我相信计算赔率的公式是totalEntrants - 奖品/奖品:
(3215-5)/5 = 642
所以获胜的赔率为642比1 - 是吗? (我吮吸数学)
在我的数据库中包含3215行的表中,我只选择一个随机行?
SELECT * from entries
WHERE entries.won = 0
ORDER BY RAND()
LIMIT 1
现在我有一行,我需要将won
列设置为1
,这样参赛者才能再次获胜,然后再次运行?这是我第一次这样做,所以我只想确认我是否正确地做了。
答案 0 :(得分:6)
没错。五人可以获胜,有3215名参赛者,因此获胜的几率是3215÷5,即643中的1,或者是642比1。每643个赢1个意味着每1个赢家有642个输家。请注意“x in y chance”与“x-to-y chance”之间微妙的一次性差异。
您的选择方法看起来很好。您也可以通过将其更改为LIMIT 5
来一次性选择它们。
答案 1 :(得分:2)
为什么不使用LIMIT 5
一步选择获奖者?
答案 2 :(得分:2)
获胜赔率 totalEntrants / prizes
无需减少奖品数量。例如,如果我们有2个参赛者和一个奖品,赔率为2/1,这意味着每个参赛者都有两个获胜机会中的一个(如果我们减少奖金数量是1/1,这意味着一对一的机会 - 确保赢...)
查询似乎正确:
答案 3 :(得分:1)
我认为你不能在同一个查询中选择和更新。我要做的是使用您的查询选择一个随机赢家,并在返回ID的寄存器上执行更新,将“赢”字段更改为值1.然后您只需重复该过程4次。 :)
答案 4 :(得分:1)
使用:
CREATE TEMPORARY TABLE won LIKE ENTRIES;
DECLARE numAwards INT DEFAULT 5;
WHILE numAwards > 0 DO
INSERT INTO won
(columns...)
SELECT e.*
FROM ENTRIES e
WHERE e.userid NOT IN (SELECT w.userid FROM won)
ORDER BY RAND()
LIMIT 1;
SET numAwards = numAwards - 1;
END WHILE;
你也可以使用:
SELECT e.*
FROM ENTRIES e
LEFT JOIN won w ON w.userid = e.userid
WHERE w.userid IS NULL
ORDER BY RAND()
LIMIT 1;
...但性能没有差异 - 请参阅:NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQL
更新:使用LIMIT 5
并不理想,因为它不能确保一个人只赢一次,除非您假设一个人只输入一次(不太可能)。