2015-05-07 162 views
1

考慮以下幾點:隨機選擇在具有相同值的多個實例SQL

user_id weight 
     1 2 
     2 5 

是否有可能同時使用的權重影響其ID被選擇的機率隨機選擇一個用戶ID查詢?

換句話說,在這種情況下,是有一個查詢會看該表中,然後在隨機從以下組中選擇1個用戶ID:

[UserID_001, UserID_001, UserID_002, UserID_002, UserID_002, UserID_002, UserID_002] 

使UserID_002具有5/7被選擇的機會,並且UserId_001有2/7的選擇機會。

這就像每個用戶在抽獎中有多張門票,User_001有2張門票,User_002有5張門票。用SQL查詢可以做這樣的事情嗎?或者我需要使用其他方法?

在此先感謝!

+2

它會更容易了很多在應用程序級別執行此操作 - 否則,請查看[here](http://stackoverflow.com/questions/2417621/mysql-select-random-entry-but-weight-towards-certain-entries) –

+0

Hi @pala_ thanks for你的評論,我讀了你給的鏈接,我現在是testi在我的數據庫中查詢以下查詢:''SELECT * FROM mytable ORDER BY(RAND()* weight)LIMIT 1;''這似乎是每次給出一個隨機ID,我想知道我是否可以問,對你正確嗎? – Emily

+0

@pala_實際上,在做了一些測試之後,看起來這個查詢起作用了:''SELECT * FROM mytable ORDER BY -LOG(RAND())/ weight LIMIT 1;'' – Emily

回答

1

你想加權抽樣。這實際上很簡單,只要你有所有權重的累計和。

select t.* 
from (select t.*, 
      (@w := @w + weight) as cumew 
     from table t cross join 
      (select @w := 0) init 
    ) t 
where @w * rand() <= cumew 
order by weight 
limit 1; 

注意在外部查詢@w是所有的權重之和。因此,它將其乘以一個隨機數並找到大於或等於此值的第一個累計權重。

0

這是給你的彩票解決方案:-)

如果你需要看到它的工作原理,只是發表評論查詢的最後一行WHERE ...

http://sqlfiddle.com/#!9/54a44/17

SELECT * 
FROM (SELECT *, 
IF(@total IS NULL,@first:=1, @first:[email protected]+1) from_number, 
IF(@total IS NULL,@total:=tickets, @total:[email protected]+tickets) to_number, 
IF(@winner IS NULL,@winner:= FLOOR(1 + RAND() * t_sum.t_all), @winner) win 
FROM tickets 
LEFT JOIN (SELECT SUM(tickets) t_all FROM tickets) t_sum 
ON 1) t 
WHERE win >= from_number AND win <= to_number 
相關問題