2012-04-29 42 views
4

我正在尝试创建一个过滤器来显示某些被认为是“趋势”的记录。因此,这个想法是选择重要的投票记录,但不是从大多数投票到最不投票的降序排列。这样用户就可以浏览并有机会看到所有链接,而不仅仅是顶部的链接。你认为最好的方法是什么?我失去了如何创建一个随机分类的趋势链接,但没有让他们重复,因为用户从一页页到另一页。有什么建议么?如果有任何不清楚的地方,请告诉我,谢谢!如何在Mysql和PHP中创建“上升”或“热门”查询?

+2

首先 - 定义你认为会是一个很好的排序顺序。这是你的应用程序真正的肉 - 那么你可以得到一些SQL的帮助。 – Randy

+0

排序顺序是什么意思? –

回答

0

也许创建一个新的列来记录它有多少个视图?然后在每次有人查看它并通过具有最大数量的视图的线程进行排序时更新它。

+0

雅,这个想法是不显示按顺序从上到下,但随机的种类,但从高到低,这是否有道理?因此,第一页显示可以查看800-900以及700-800以下的任何地方,请参阅? –

+1

使用array_rand()。将800-900行放入一个php数组中,并获取array_rand()来随机排序它们。这些行将使用array_rand()的顺序放在顶部。对每个范围重复此操作。 –

+0

当然,但如果我只想每页显示25个结果,并且我不想重复结果,但我想向他们展示我所做的一切。 –

2

此回复假定您为每次投票在每个子表格中跟踪投票,而不是仅在特定项目上+1。

确定您关心热门话题的时间范围。也许1个小时会很好?

然后运行查询以确定哪个项目在过去一小时内获得最高票数。按此计数排序,您将持续更新最新的最新项目清单。

SELECT items.name, item_votes.item_count FROM items 
INNER JOIN 
(
    SELECT item_id, COUNT(item_id) AS item_count 
    FROM item_votes 
    WHERE date >= dateAdd(hh, -1, getDate()) AND 
      ## only count upvotes, not downvotes 
      item_vote > 0 
    group by item_id 
) AS item_votes ON item_votes.item_id = items.item_id 

ORDER BY item_votes.item_count DESC 
+0

我承认我完全不了解这个查询,但是我要找的是更多的随机性,所以它会显示投票主题,但不会按照确切顺序列出。所以基本上找到了10%的最高票数,并显示从普通高票到低票随机出现超过5页。但没有重复的结果。 –

1

你提的是,你不想重复的项目超过几页,这意味着你不能得到随机排序每个请求。您将需要检索项目,对它们进行排序,并将它们保存在服务器范围内或会话特定的缓存中。

服务器范围内的缓存需要每隔一段时间更新一次,这是您需要定义的时间间隔。发生此更新时切换页面的用户将看到他们的项目被加密。

只要用户浏览您的网站,特定于会话的缓存就会维护这些项目,这意味着如果您的用户永远不会离开,这些项目将会过期。再一次,您需要确定执行更新的时间间隔。

我在想你需要一个版本清单。你可以做服务器级的缓存解决方案,并给它一个版本(日期,整数,任何东西)。浏览最新趋势时,您需要通过此版本,并且用户将继续查看相同的列表。点击趋势菜单链接将把它们发送到没有版本信息的浏览页面,这些信息应该从缓存中获取最新信息。只要用户正在浏览这些页面,您就可以保留这些内容。

我不能进入sql语句,不是因为它们很难,但我们不知道你的数据库结构。你是否在单独的表格中跟踪个人投票?他们只是聚合成一个列?

+0

我有一张表来跟踪用户投过来的每一篇文章,关于服务器端缓存的唯一问题如果您有数千篇文章,会发生什么?无论您需要分类的物品数量多少,您只需要运行这项工作?你怎样才能把组织保存在一个表格中? (对不起,如果这是很多问题,只是想学:) :) –

+0

这取决于数据库检索匹配,你需要适当的索引设置。您的代码中完成的排序仅适用于数据库中返回的帖子的小部分。从数据库返回的一千个帖子是一个很小的数量,你应该能够订购它,而不必担心速度。然后,您可以将结果作为帖子标识符列表进行缓存,也可以将内容呈现为html,并在请求时向用户显示。你在谈什么类型的组织? – sisve