2011-08-01 71 views
1

我想從表中選擇一個隨機記錄,但在特定字段中偏向於更高的值 - 我不希望任何記錄有0%的選擇機會,只是不太可能被選中。有偏見的MySQL隨機記錄

從這篇文章中,我知道,隨機選擇可能會很慢,你可以加速起來: http://wanderr.com/jay/order-by-slow/2008/01/30/

但是,當你用了幾桌應對加入什麼,一個where語句,並希望使用其中一個字段作爲偏倚隨機性的一種方式(此字段的值越高,選擇的可能性越大)?例如:

SELECT a.id, a.date, a.userid, b.points FROM table_a AS a INNER JOIN table_b AS b ON (a.userid = b.userid) WHERE DATE_SUB(CURDATE(), INTERVAL 60 DAY) <= a.date 

我怎樣才能把上述變成一個高效的但並非真正隨機的查詢,將偏向b.points的更高值?

回答

0

我的2美分,偏壓可以這樣進行:

假設分數是0之間,100

您隨機選擇5個記錄即> 75,3記錄> 50,2記錄> 25,1條記錄> 0

現在,如果你從這11條記錄中再次隨機選擇,它會偏向更高的分數。

把它們放在SQL,叫你的連接表「ABC」

Select * from (
select * from abc where b.points > 75 order by rand() limit 5 
cross join 
select * from abc where b.points > 50 and b.points <75 order by rand() limit 3 
cross join 
select * from abc where b.points > 25 and b.points <50 order by rand() limit 2 
cross join 
select * from abc where b.points > 0 and b.points <25 order by rand() limit 1 
) as result 
order by rand() limit 3 

在性能方面,我要看看你的鏈接和更新此anwser。