基于评级和时间戳的PHP MYSQL搜索

时间:2013-03-26 09:38:14

标签: php mysql sql-order-by rating-system

我的搜索查询运行如下:

 select * from posts p where p.post like '%test%' ORDER BY p.upvotes DESC, 
 p.unix_timestamp DESC LIMIT 20

如果搜索关键字的结果超过20个,我会找出最小时间戳值,将其存储在隐藏元素中并运行另一个查询以加载更多结果,如:

select * from posts p where p.post like '%test%' and p.unix_timestamp < 1360662045
ORDER BY p.upvotes DESC, p.unix_timestamp DESC LIMIT 20

真正发生的事情是我的第一个查询忽略了(显然,我的错误)帖子,因为我的ORDER BY p.upvotes DESC没有任何投票(意味着0票),因此,我注意到它在前20个结果中获取了表中的第一个帖子,因此最小时间戳成为第一个帖子的时间戳。在此之后,如果我尝试获取接下来的20个小于最小时间戳的结果,它就不会给出任何结果。

现在,我只是使用upvotes命令来获取热门记录。我应该使用像贝叶斯平均值或其他算法的算法吗?

如果我必须继续使用当前的订购系统,或者我应该使用哪种可行且更有效的方法,请告知我如何改进查询?

P.S。如果可能,请参考一些有关贝叶斯平均值(似乎最常用)或其他替代方案的资源?

1 个答案:

答案 0 :(得分:0)

在您第一次搜索时存储时间戳,然后将其用于下一个查询,您可以使用以下内容: -

$sql = "SELECT * 
FROM posts p 
LEFT OUTER JOIN (SELECT post_id, COUNT(*) FROM post_ratings WHERE timestamp_rated <= $SomeTimeStoredBetweenPages GROUP BY post_id) pr ON p.id = pr.post_id 
WHERE p.post like '%test%' 
ORDER BY pr.post_ratings DESC, p.unix_timestamp 
DESC LIMIT ".(($PageNo - 1) * 20)." 20";

这是一个很好的例子,因为我对你的表格结构并不了解。也不确定你是否只为每次投票选出了一行,或者是否还有投票也要考虑到。

相关问题