我有一个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
答案 0 :(得分:1)
为了减少导航的随机性,您可以按其他字段添加排序。例如,通过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现在转到上一页(第一页),则链接到其上的“下一页”可能不会指向第二页。
答案 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,反之亦然。