0

让我们把它放在最简单的表中,一个包含两个字段的表:“item_id”和“times_seen”。

| item_id | times_seen |
----------+-------------
|   1001  |     48     |
|   1002  |     25     |
|   1003  |      1     |
|   1004  |     12     |
|   1005  |     96     |
|   1006  |     35     |

我试图找到一种随机选择一行的方法,但优先考虑以前没有被选中的项目。

(显然,将发送第二个查询以在选择“times-seen”字段后增加它)

虽然我目前的“项目”是一个 php/mysql 项目,但如果可能的话,我想要与语言无关的解决方案。我宁愿有一个可以在其他地方适应的基于数学的解决方案。不过,我并不反对 php 解决方案。我只想能够理解代码是如何工作的,而不是仅仅复制和粘贴它。

4

2 回答 2

2
  1. 获取表中的所有行
  2. 确定最大值times_seen
  3. 为每一行分配一个权重max - times_seen
  4. 根据权重从列表中选择

第 4 步是棘手的​​部分,但您可以这样做:

$max = 1;
$rows = array();

$result = mysql_query("SELECT * FROM table");
while ($row = mysql_fetch_array($result)){
    $max = max($max, $row['times_seen']);
    $rows[] = $row;
}

$pick_list = array();
foreach ($rows as $row){
    $count = $max - $row['times_seen'];
    for ($i=0; $i<$count; $i++) $pick_list[] = $row['item_id'];
}
shuffle($pick_list);
$item_id = array_pop($item_id);

要在 SQL 中完成所有操作:

SELECT * 
FROM table 
ORDER BY RAND( ) * ( MAX( times_seen ) - times_seen ) DESC
LIMIT 1

这将选择权重与times_seen

于 2012-04-05T22:36:08.153 回答
2

SQL解决方案怎么样:

select * from item order by times_seen + Rand()*100 limit 1;

你将随机乘以多少(它的值介于 0 和 1 之间)取决于你想要多少随机性。

编辑:http ://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_rand

于 2012-04-05T22:43:09.670 回答