在MySQL中分页,在不同的页面上没有重复的结果

时间:2016-02-11 16:14:54

标签: php mysql pagination

在我们的网络应用中,我们有分页查询用户帖子的页面。我们通过用户生成的排名(如reddit)对帖子进行排序,该排名可能会随着用户在帖子中进行分页而发生变化。我们正在尝试阻止已经显示的帖子再次被选中。有办法解决这个问题吗?例如,Facebook设法以某种方式执行此操作,其中新帖子不会弄乱您正在滚动的实际查询。

我正在考虑的一些事情可以解决问题,但我不确定是否可行:

  1. 当用户在第一页上时,“快照”排名表,只是继续查询此快照中的后续页面。这样订单不会改变,但不确定是否可以做这样的事情。

  2. 一次查询大量的帖子,例如500个帖子,只需遍历该结果即可。这可能对用户有用,因为用户不可能一次查看超过500个帖子是不可想象的。但这可能效率很低。但是,如果你在哪里这样做,那么memcache结果就好了,比如10分钟,并且只是从存储在memcache中的结果中获取帖子(更新数据的延迟应该是10分钟)打扰任何人),这反过来非常有效,因为大多数用户将加载帖子,甚至没有查询数据库。当然,对于我按最新帖子排序的页面,我无法使用此缓存方法,但是更容易设置一个条款以避免重复as detailed here

  3. 3)取消memcache想法,我当然可以memcache更小的位数(一次说20个帖子),但这很可能导致重复的帖子。

    这或多或少是我们用来在页面上发帖子的当前代码:

         $page = $_GET['page']; //getting the page number
         if(empty($page)){$page = 1;}
         $per_page = 5; //number of posts per page
         $pcount = $page*$per_page;
         $start_p = ($pcount - $per_page); //offset for sql query
    
         $query = "SELECT p.*
            FROM posts as p
            INNER JOIN post_rankings as r ON p.ID = r.post_id
            ORDER BY r.ranking DESC
            LIMIT $per_page OFFSET $start_p";
    

    此代码可以正常获取正确的帖子,但当然它不会考虑订单中可能的移动,因此会给我们重复的帖子。有什么想法吗?

0 个答案:

没有答案