使用非唯一值对MySQL查询进行排序

时间:2016-10-08 12:08:03

标签: mysql

我想创建一个带有下一个和上一个按钮的导航,我想按照帖子的普遍排序顺序。人气专栏是通过观点+喜欢

制作的
Post_id | post_popularity
1       | 25    
2       | 10
3       | 30
4       | 10
5       | 45

所以我尝试添加查询

//Previous
SELECT * FROM posts WHERE post_live=1 and post_popularity>$post_popularity ORDER BY post_popularity ASC LIMIT 1

//Next
SELECT * FROM posts WHERE post_live=1 and post_popularity<$post_popularity ORDER BY post_popularity DESC LIMIT 1

这似乎循环了大部分帖子,然后我尝试

//Previous
SELECT * FROM posts WHERE post_live=1 and (post_popularity > $post_popularity) OR (post_popularity = $post_popularity AND post_id < $post_id) ASC LIMIT 1

//Next
 SELECT * FROM posts WHERE post_live=1 and (post_popularity < $post_popularity) OR (post_popularity = $post_popularity AND post_id > $post_id) ASC LIMIT 1

这似乎做同样的事情。循环播放大部分帖子。有关如何存档此查询的任何指针。我非常适合你的帮助。

1 个答案:

答案 0 :(得分:0)

我会用一个查询选择当前,上一个和下一个帖子。通过这种方式,您必须执行较少的查询来加载显示一个站点所需的所有数据。

SELECT * FROM posts WHERE post_live=1 ORDER BY post_popularity ASC LIMIT 3 offset $index_of_current_post_minus_one;

对于$index_of_current_post_minus_one 0的第一篇文章$index_of_current_post_minus_one。你得到3个结果,第一个是当前项目,第二个是下一个,第三个可以忽略。如果您点击下一个按钮,您的计数器会增加0变为$index_of_current_post_minus_one(显示的帖子的索引为1但您总是减去1)。从现在开始,它变得直截了当。第一个结果行是您的前一行,第二行是您的当前行,第三行是您的下一行。再次点按,1变为alter table post add index pop_live(post_popularity, post_live); ,依此类推。

此外,您应该在桌面上创建一个索引,根据其受欢迎程度对帖子进行预先排序,这样就不能为每个查询排序行:

python3 manage.py runserver