加权旋转台设计

时间:2013-01-14 19:35:36

标签: mysql

我很难完成这个非常简单的项目。也许是因为星期一,我不确定。

我有一个看起来像这样的表:

id        |        weight        |    hits
------------------------------------------------
    1     |         4            |     0
    2     |         1            |     0
    3     |         2            |     0

显然,每次选择特定记录时,hits列将增加1(我们将在PHP脚本中运行此更新)。

我怎样才能最好地按重量检索这些记录?我的意思是,如果我运行了15次查询,我希望返回以下ID:

1
1
1
1
3
3
2
1
1
1
1
3
3
2
1

我们有一个简单的公式,我们上网检索随机加权结果,但我们没有运行足够的公式来统计平衡结果,所以我们需要进行如上所述的简单旋转。

我知道这是一个很难解决的问题,但我现在很难想出今天最好的方法。

我希望在描述问题时我已经足够清楚了。

2 个答案:

答案 0 :(得分:1)

除非我遗漏了某些东西(毕竟这是星期一),你不能只按hits / weightLIMIT 1排序吗?

答案 1 :(得分:0)

执行命令

SELECT id FROM tbl WHERE weight - hits > 0 ORDER BY weight DESC LIMIT 0,1

使用上一个结果,运行:

UPDATE tbl SET hits = hits + 1, total_hits = total_hits + 1 WHERE id = (THE RESULT);

然后运行

SELECT (Sum(weight-hits)) FROM tbl

如果result = 0

UPDATE tbl SET hits = 0

修改

可以通过两个查询来实现:

$query="SELECT id FROM tbl, weight - hits  AS diff  WHERE weight - hits > 0 ORDER BY weight DESC";
$result=mysql_query($query);
$num=mysql_numrows($result);

$i=0;
$id=mysql_result($result,$i,"id");
$diff =0;
while ($i < $num) {
$diff= $diff + mysql_result($result,$i,"diff");
++$i;
}

if( $diff = 1 and $i = 1);
$query2="UPDATE tbl SET hits = 0, total_hits = total_hits + IF(id='$id',1,0)";
else{ 
$query2="UPDATE tbl SET hits = hits + 1, total_hits = total_hits + 1 WHERE id = '$id'";
}

mysql_query($query2);