2013-05-12 23 views
0

我有一個客戶,我正在開發一個視頻網站。他希望從數據庫中提取兩個視頻,以顯示前端用戶進行投票。從數據庫中提取記錄,優先選擇具有較高投票數的記錄

視頻表有一個「投票」字段。他希望隨機抽取視頻,但對具有較高投票數的視頻有更高的偏好。某些類型的算法,其中的投票是偏好的,但不是直接的「最高票2個視頻被拉」。

任何想法?

繼承人什麼我的視頻表如下所示:

$data[] = array(
     'id' => $row->id, 
     'filename' => $row->filename, 
     'added' => $row->added, 
     'userId' => $row->userId, 
     'contestId' => $row->contestId, 
     'complete' => $row->complete, 
     'ended' => $row->ended, 
     'votes' => $row->votes 
    ); 
+0

這就是你的數據陣列的樣子。你的視頻表(我猜)看起來有點不同。 – Strawberry 2013-05-12 17:04:53

回答

0

只要使用的ORDER BY votes * ($offset + rand()) DESC,其中偏移餘額的隨機一個很好的平衡之和。如果偏移量爲0,則它​​大部分是隨機的,如果偏移量爲1或更高,則未提交的視頻將永遠不會顯示。

您可以嘗試幾次幹運行得到的視頻,看看你是否喜歡它。 ;-)

編輯:

答案取決於選票,這將是在數據庫的範圍和分佈。

0

考慮以下...

SELECT * FROM weighted; 
+----+--------+ 
| id | weight | 
+----+--------+ 
| 1 |  3 | 
| 2 |  1 | 
| 3 |  6 | 
| 4 |  5 | 
| 5 |  10 | 
| 6 |  2 | 
| 7 |  3 | 
| 8 |  7 | 
| 9 |  7 | 
+----+--------+ 

So, crudely... 

SELECT *,RAND()*weight FROM weighted; 
+----+--------+--------------------+ 
| id | weight | RAND()*weight  | 
+----+--------+--------------------+ 
| 1 |  3 | 1.7466305203238788 | 
| 2 |  1 | 0.6615251914239724 | 
| 3 |  6 | 3.3659728051777673 | 
| 4 |  5 | 4.102008970549338 | 
| 5 |  10 | 4.190225986940997 | 
| 6 |  2 | 1.2678152837490806 | 
| 7 |  3 | 2.737411332072142 | 
| 8 |  7 | 4.624405276611824 | 
| 9 |  7 | 3.9601472736896457 | 
+----+--------+--------------------+ 

SELECT *,RAND()*weight x FROM weighted ORDER BY x DESC LIMIT 1; 
+----+--------+--------------------+ 
| id | weight | x     | 
+----+--------+--------------------+ 
| 8 |  7 | 4.6799722441285585 | 
+----+--------+--------------------+ 

SELECT *,RAND()*weight x FROM weighted ORDER BY x DESC LIMIT 1; 
+----+--------+-------------------+ 
| id | weight | x     | 
+----+--------+-------------------+ 
| 9 |  7 | 5.331623214605845 | 
+----+--------+-------------------+ 

SELECT *,RAND()*weight x FROM weighted ORDER BY x DESC LIMIT 1; 
+----+--------+-------------------+ 
| id | weight | x     | 
+----+--------+-------------------+ 
| 4 |  5 | 4.931961209449881 | 
+----+--------+-------------------+ 

SELECT *,RAND()*weight x FROM weighted ORDER BY x DESC LIMIT 1; 
+----+--------+-------------------+ 
| id | weight | x     | 
+----+--------+-------------------+ 
| 8 |  7 | 6.230309537826394 | 
+----+--------+-------------------+ 

SELECT *,RAND()*weight x FROM weighted ORDER BY x DESC LIMIT 1; 
+----+--------+-------------------+ 
| id | weight | x     | 
+----+--------+-------------------+ 
| 5 |  10 | 5.470934962361059 | 
+----+--------+-------------------+ 
相關問題