0

我有一个正在为其开发视频网站的客户。他想从数据库中提取 2 个视频来显示前端用户进行投票。

视频表有一个“投票”字段。他希望随机拉取视频,但对票数较高的视频给予更高的偏好。某种算法,其中投票被优先考虑,但不仅仅是“最高投票的 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
    );
4

2 回答 2

0

只需使用一个很好平衡的总和ORDER BY votes * ($offset + rand()) DESC,其中偏移量平衡随机化。如果偏移量为 0,则它主要是随机的,如果偏移量为 1 或更高,则永远不会显示未投票的视频。

您可以试运行几次生成的视频,看看是否喜欢。;-)

编辑:

答案取决于数据库中投票的范围和分布。

于 2013-05-12T16:16:46.710 回答
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 |
+----+--------+-------------------+
于 2013-05-12T17:10:29.803 回答