我有一個(gè)帶有大量條目的MySQL表,以及一個(gè)名為“ Multiplier”的列。此列的默認(rèn)值(也是最常見(jiàn)的)是0,但可以是任何數(shù)字。我需要做的是從該表中隨機(jī)選擇一個(gè)條目。但是,將根據(jù)“乘數(shù)”列中的數(shù)字對(duì)行進(jìn)行加權(quán)。值為0表示完全不加權(quán)。值1意味著它的權(quán)重是表中條目的兩倍,是它的兩倍。值2表示它的權(quán)重是表中該條目的三倍,是它的三倍。我正在嘗試修改開(kāi)發(fā)人員已經(jīng)給我的內(nèi)容,所以如果設(shè)置沒(méi)有任何意義,請(qǐng)您抱歉。我可能可以更改它,但要保留盡可能多的現(xiàn)有表設(shè)置。我一直在嘗試找出如何使用SELECT和RAND()進(jìn)行此操作,但不知道如何進(jìn)行加權(quán)??赡軉幔?
3 回答

紅糖糍粑
TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
為了獲得更好的性能(特別是在大表上),請(qǐng)首先為weight列建立索引并使用以下查詢:
SELECT * FROM tbl WHERE id IN
(SELECT id FROM (SELECT id FROM tbl ORDER BY -LOG(1-RAND())/weight LIMIT x) t)
使用兩個(gè)子查詢,因?yàn)镸ySQL在第一個(gè)子查詢中尚不支持LIMIT。
在40MB的表上,通常的查詢?cè)谖业膇7機(jī)器上花費(fèi)1s,而這個(gè)查詢花費(fèi)0.04s。
添加回答
舉報(bào)
0/150
提交
取消