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

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