带随机化的加权数据库查询

时间:2015-08-01 08:16:55

标签: python mysql sql django

我有一个数据库模型,其中包含一个名为' weight'的正整数列。还有其他专栏,但它们对此问题并不重要。权重列基本上描述了重要的'这一行是。重量值越高,越重要。权重范围仅为0 - 3.默认值为0(最不重要)。

我想执行一个查询,该查询选择按权重列排序的50行,但稍微随机化并包含权重低于结果中的行的行。

例如,按权重排序的前50行可能都具有3和2的权重。查询需要主要包括这些结果,但也包括权重为1和0的一些。它们需要稍微随机化同样的查询也不会总是返回相同的结果。此外,即使它将结果限制为50,它也需要最后执行此操作,否则将以不同的顺序返回相同的50个结果。

这将集成在Django项目中,但DB是MySQL,因此原始SQL是可以的。

性能至关重要,因为这会发生在高流量网站的目标网页上。

任何想法都会受到赞赏。

由于

1 个答案:

答案 0 :(得分:0)

您可以将rand()功能与weight

结合使用
select * from YOUR_TABLE order by weight * rand() desc

请注意,这意味着重量3在开始时可能比重量2更可能出现。

权重0始终显示在结尾,因为0 *任何数字始终为0.如果您不喜欢,您可以将1添加到权重并将查询转换为

select * from YOUR_TABLE order by (weight + 1) * rand() desc

显然,如果只需要前50个值,可以在查询中添加limit子句