类似博客的上一篇下一篇的功能,sql 怎么设计?

2014-05-11 21:20:54 +08:00
 hjse7en
想实现在阅读一篇博文时提供上一篇文章,下一篇文章的链接及标题的功能。现在用的sql是:
SELECT
min(id) AS id,
'next' AS label,
title AS title
FROM article
WHERE id > 33
AND userId = 4
UNION
SELECT
max(id),
'pre',
title
FROM article
WHERE id < 33
AND userId = 4
;
在sql查出来的结果里,用label值判断是上一篇文章还是下一篇文章。这样做感觉不是很好,V友们有没什么更好的方法?
4342 次点击
所在节点    程序员
19 条回复
Wuvist
2014-05-11 23:04:57 +08:00
就是分页,只是每页两个项目;你分页时怎么做,这里就怎么做。

分页查询参考:
http://www.cnblogs.com/wuvist/archive/2010/03/15/1686267.html

的风格3.
cbsw
2014-05-11 23:20:39 +08:00
只用过 Django 自带的分页,具体底层实现不是很清楚
lincanbin
2014-05-11 23:31:51 +08:00
多加一条查询太花时间,建议直接加个字段保存上一篇和下一篇的内容。
然后发布博文和删除时,对可能受影响的记录进行update
txlty
2014-05-11 23:35:22 +08:00
order by id desc / asc 各取一条,也可以。
kxxoling
2014-05-11 23:42:44 +08:00
SELECT * FROM table LIMIT 3 OFFSET n-1; 这样?可以获取这篇文章及上下两篇文章,但n必须是本篇文章的rownum。
kxxoling
2014-05-11 23:50:05 +08:00
@txlty id不连续怎么办?某些数据库在某行被删除后id依旧会继续增加。
txlty
2014-05-12 00:08:22 +08:00
@kxxoling 我的意思是这样 where id<[当前id] order by id desc limit 0,1
hjse7en
2014-05-12 09:26:48 +08:00
@txlty 这样可以,跟我那种是一样的
hjse7en
2014-05-12 09:29:09 +08:00
@lincanbin 像这种,如果删的记录在中间,那就有两条记录得做更新了
dong3580
2014-05-12 10:19:33 +08:00
@hjse7en
不知道楼主问的是哪个SQL?
我只会MSSQL和Oracle.
可以这样分页:
select id,title
from article
where userid=4 and id>=1 and id<10
//动态变化id就达到分页了.
至于上一篇上一篇,肯定是点进这个页面之后才有的呀,
例如点进 id为10的页面,在url里面可以加上: xxx.aspx?id=10
那么他的
上一篇就是xxx.aspx?id=9
下一篇就是xxx.aspx?id=11
另外就是union尽量少用,
blogphp230com
2014-05-12 11:51:16 +08:00
根据文章ID或者文章发布时间来获取
上一篇:where id<123 order by id desc limit 1
下一篇:where id>123 order by id sac limit 1
hjse7en
2014-05-12 13:21:23 +08:00
@dong3580 id 不一定是连续的,中间可能有间隔.使用union是想只执行一次查询就可以获得结果,其实这里用union all就可以.
dong3580
2014-05-12 14:30:47 +08:00
@hjse7en
如果id不连续,你上面的所谓语句确定没问题?
不连续那就查询两次呗,个人建议像这种非复杂的查询不要使用union之类的高级功能,看你自己吧.
如果是oracle就用rownum,更简单;
如果是MSSQL用row_number一样啊.

select pageid,id,title
from(
select row_number() pageid,id,title
from article
where userid=4
)
where pageid>=1 and pageid<10
PS:我现在没法用mssql工具,语句类似上面的.
dong3580
2014-05-12 14:32:27 +08:00
@hjse7en
另外rownum,row_number()压根与id没关系,所以你删除不删除文章没影响吧.
hjse7en
2014-05-12 21:13:26 +08:00
@dong3580 id是自增长的,这里查出来的结果是根据user过滤的,所有有可能一个用户下,上一篇文章跟下一篇文章中间有几个间隔id是别的用户的。
dong3580
2014-05-13 13:01:52 +08:00
@hjse7en
RT,我上面不是重复了么?
加个where不就好了,rownum,row_number()与id毛的关系,
dong3580
2014-05-13 13:20:06 +08:00
@hjse7en
遇到这样的sql只需要多查两次,
第一次查询 [得到想要的数据(这里可以考虑where,实在太复杂可以在里面再加个select查询)] 并且 [排序(可以用order by排序,group by分组,或者over分组)] ,
第二次再第一次的基础上取出想要的数据,还是很简单的。
基本上都是大同小异。
lincanbin
2014-05-14 00:57:22 +08:00
@hjse7en 所以删除和发布页面都要做一次Update,这样对服务器资源还有稍微有点节省作用的。
lincanbin
2014-05-14 00:58:17 +08:00
@dong3580 你想优化这条语句,无非就是想节约服务器资源,照我说的那样做,空间换时间,多划算啊。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/112069

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX