根据视图获取下一个和上一个MySQL id

时间:2016-06-11 04:01:36

标签: php mysql

我有一个MySQL数据库,可以保存帖子ID,帖子和视图。我想根据视图添加指向下一篇和上一篇文章的链接。

-------------------------------
| Id  | Post       | views    |
-------------------------------
| 1   | Title 01   |   10     |
| 2   | Title 02   |   20     |
| 3   | Title 03   |     5    |
| 4   | Title 04   |     0    |
| 5   | Title 05   |     0    |
| 6   | Title 06   |     0    |
| 7   | Title 06   |     6    |
-------------------------------

所以我尝试跟随查询。 $post_id是当前的帖子ID。

// Previous 
SELECT * FROM posts WHERE id>'$post_id' ORDER BY views ASC LIMIT 1 

// Next
SELECT * FROM posts WHERE id<'$post_id' ORDER BY views DESC LIMIT 1 

以上查询返回错误结果。

// Previous 
SELECT * FROM posts WHERE views>'$views' ORDER BY views ASC LIMIT 1 

// Next
SELECT * FROM posts WHERE views<'$views' ORDER BY views DESC LIMIT 1 

那些返回结果直到零发生(从我上面添加的示例数据),所以我将where子句更改为views>='$views'(上一个)和views<='$views'(下一个),这会返回错误的结果。

我知道这似乎是一个简单的问题,但我搜索到处都找不到任何正常的东西很容易根据帖子ID获得下一个和之前的帖子,但视图根本不起作用。

非常感谢您的时间和答案。

修改观看列位于INT

更多细节。

我的父页面绞盘呼叫视图具有以下查询

SELECT * FROM posts WHERE views DESC LIMIT 10

因此,当用户点击这些帖子中的任何帖子时,这将显示帖子ID 2,1,7,3,4,5,6,它将显示带有下一个和上一个导航的完整帖子的帖子,所以我希望上一个和下一个导航的顺序与父页面是2,1,7,3,4,5,6

2 个答案:

答案 0 :(得分:1)

为了减少导航的随机性,您可以按其他字段添加排序。例如,通过Id。您需要精确的算法才能每次都获得相同的结果。这只是这种算法的一个例子:

  1. 按观看次数排序按降序排列。
  2. 如果两个帖子的观点相同,则按升序排列这些帖子。
  3. 在这种情况下,我们总是可以选择单个,而不是随机,下一个(上一个)帖子。

    -- Previous post
    SELECT *
    FROM posts
    WHERE (views > '$views') OR (views = '$views' AND Id < '$post_id')
    ORDER BY views ASC, Id DESC
    LIMIT 1;
    
    -- Next post
    SELECT *
    FROM posts
    WHERE (views < '$views') OR (views = '$views' AND Id > '$post_id')
    ORDER BY views DESC, Id ASC
    LIMIT 1;
    

    此外,您还需要修改父页面上的查询并在此处添加排序:

    SELECT * FROM posts ORDER BY views DESC, Id ASC LIMIT 10
    

    注意:

    网站可以同时与多个用户一起使用。这种导航在一般情况下不起作用。例如,user1打开第一个帖子,然后转到下一个(第二个)帖子。此时user2也打开了第一个帖子并且它的视图计数已更改。如果user1现在转到上一页(第一页),则链接到其上的“下一页”可能不会指向第二页。

答案 1 :(得分:0)

获取之前的值。找到所有视图小于当前的视图,然后按顺序排序,最后一个是前一个。

SELECT * FROM posts WHERE views<'$views' ORDER BY views DESC LIMIT 1

获取下一个值。找到所有视图大于当前的视图,然后按顺序排序,然后第一个是下一个。

SELECT * FROM posts WHERE views>'$views' ORDER BY views ASC LIMIT 1 

这里只有边缘情况才是视图相等的情况,在这种情况下你必须得到所有相等的视图然后按id排序然后如果视图相等则再添加一个条件id&gt;当前id,反之亦然。