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



我有一个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

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

  1. 按浏览次数降序对帖子进行排序
  2. 如果两个帖子的视图相等,则按Id升序对这些帖子进行排序

在这种情况下,我们总是可以选择单个,而不是随机的,下一个(上一个)帖子。

-- 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现在转到上一页(第一页),则它上"下一页"的链接可能不会指向第二页。

获取上一个值。在这里找到所有视图小于当前视图的,然后按降序排序,最后一个是前一个。

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

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

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

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

相关内容

最新更新