【发布时间】:2011-01-16 08:02:09
【问题描述】:
假设我有一个博客帖子表,其中有一个评级字段,用于指示帖子的质量。随机查找帖子的最有效方法是什么,更有可能返回排名靠前的帖子?
我将在 PHP、MySQL 和可能的 Lucene 中实现这一点。
【问题讨论】:
假设我有一个博客帖子表,其中有一个评级字段,用于指示帖子的质量。随机查找帖子的最有效方法是什么,更有可能返回排名靠前的帖子?
我将在 PHP、MySQL 和可能的 Lucene 中实现这一点。
【问题讨论】:
一个简单的解决方案是包含对RAND() 和rating 列的调用并将它们相乘:
SELECT title, content FROM blog_posts ORDER BY (rating + 1) * RAND() DESC LIMIT 1;
如果您发现这对评分较高的项目给予了过多的优先权,您可以使用SQRT:
SELECT title, content FROM blog_posts ORDER BY SQRT(rating + 1) * RAND() DESC LIMIT 1;
【讨论】:
rating 上 +1。
您可以使用“加权随机”排序,例如:
SELECT title, body FROM posts ORDER BY (score+1) * RAND() DESC LIMIT 5
+1 允许选择得分为 0 的帖子。 根据您帖子的平均分数,您可能需要将分数乘以另一个常数因子(例如。0.5*score+1)
根据分数的分布情况,您可能需要转换分数,例如使用LOG(score) 或SQRT(score)。
【讨论】:
RAND 在处理大型数据集时确实会变慢。请参阅forums.mysql.com/read.php?24,163940,163940#msg-163940 了解可能的解决方法。
0.5会达到什么效果?
SQL 命令:
SELECT * FROM posts WHERE id = '$randomly_generated_ids' ORDER BY ratings ASC
例如 $randomly_generated_ids 可以是“13,10,5,20”
详细信息:ORDER BY
【讨论】: