2013-03-26 117 views
0

我的搜索查询的运行,如:PHP MYSQL搜索

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 upvotes的帖子,但会开始显示所有帖子,包括0 upvotes的帖子,从具有最大upvotes的帖子开始。如果所有有upvotes 0它将按时间戳排序。我想念什么?附:您应该将已达到的upvotes值也存储在隐藏字段中,并将其传递给第二个查询。 – 2013-03-26 09:48:38

+0

我不是一次性获取匹配搜索关键字的所有帖子,而是在大量20次的情况下进行匹配。因此,它忽略了第一个查询本身有0个upvotes的情况,以及一个情况下最小时间戳的情况的第一个20的结果是表中的第一个职位,因为在第二个查询中没有找到任何东西。 – coder101 2013-03-26 09:51:29

+1

你的查询没有任何建议它会忽略0 upvotes。您提供的查询会显示它们 – 2013-03-26 09:54:05

回答

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"; 

这是非常一个例子,因为我有你没有真正的想法表结构。也不确定是否每个投票都有一排,或者是否有投票也要考虑。

+0

downvotes也有,并有upvotes以及downvotes特定的行。表格结构与您的建议完全相同。 – coder101 2013-03-26 10:48:31

+0

我想你假设我正在做分页这就是为什么变量'$ pageNo',但我只是在最后加载链接加载更多的结果。那么,我如何将你的查询放入我的结构? – coder101 2013-03-26 11:01:09

+0

您可以在子查询中仅添加一个检查行,该行是upvote还是downvote作为WHERE子句。通过给出“更多记录”的链接,你实际上正在做分页。只需在该链接的末尾添加一个变量作为页码(默认为1)。 – Kickstart 2013-03-26 13:39:12