我有一个数据库模型,其中有一个名为“权重”的正整数列。还有其他列,但它们对于这个问题并不重要。权重列基本上描述了这一行的“重要性”。权重值越高,越重要。权重范围仅为 0 - 3。默认值为 0(最不重要)。
我想执行一个查询,选择按权重列排序的 50 行,但已稍微随机化,并且包含权重低于结果中的行。
例如,按权重排序的前 50 行的权重可能全部为 3 和 2。查询需要包含大部分这些结果,但也包括一些权重为 1 和 0 的结果。它们需要稍微随机化同样,相同的查询并不总是返回相同的结果。另外,即使它将结果限制为 50 个,它也需要最后执行此操作,否则将以不同的顺序返回相同的 50 个结果。
这将集成到 Django 项目中,但数据库是 MySQL,因此原始 SQL 就可以了。
性能至关重要,因为这将发生在高流量网站的着陆页上。
任何想法将不胜感激。
谢谢
最佳答案
您可以将 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 子句添加到查询中
关于python - 带随机化的加权数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31759791/