首页 新闻 会员 周边

SQL查询当前数据上一条和下一条的记录 怎么解决多字段排序问题?

0
悬赏园豆:60 [待解决问题]

方法一:

string preSql = "select top 1 * from news where news_id < " + id + " order by news_id DESC"

string nextSql  = "select top 1 * from news where news_id > " + id + " order by news_id ASC"

方法二:

string preSql = "select * from [news] where news_id = (select MAX(news_id) from [news] where news_id<" + id + ")";
string nextSql = "select * from [news] where news_id = (select MIN(news_id) from [news] where news_id>" + id + ")";

问题补充:

Id         Ordered
1           5
2           4
3           3
4           2
排序条件  Order by Ordered asc,Id desc
当Id=2时   正确的上一条应该是  Id=3的那一条,
下一条应该是Id=1的那一条,
Ordered 字段 可以重复  如全部为0

小写X的主页 小写X | 初学一级 | 园豆:145
提问于:2011-07-21 11:19
< >
分享
所有回答(5)
0

直接在第一个order by 的字段后面加就可以了,中间用逗号隔开,不过先走第一个排序

蓦然回首的思念 | 园豆:900 (小虾三级) | 2011-07-21 11:41
不行, 我有个自定义排序字段 Ordered asc,Id desc ,所以上一条的Id并不一定是 news_Id
支持(0) 反对(0) 小写X | 园豆:145 (初学一级) | 2011-07-21 14:26
0

首先,得分清你所说的“下一条”是以什么为依据?new_ID,还是新闻的发布时间,这两个有时候是不一致的。

其次,如果有必要,可以在编辑新闻时候,手动加上“上一个”ID和"下一个"ID,保存在本记录中。

邀月 | 园豆:25475 (高人七级) | 2011-07-21 12:02
上一个和下一个要根据自定排序字段才能得出来啊
支持(0) 反对(0) 小写X | 园豆:145 (初学一级) | 2011-07-21 14:27
0

1、根据你的排序规则,查找上一条和吓一条

2、order by createtime desc,userid asc,birthday desc

Virus-BeautyCode | 园豆:1619 (小虾三级) | 2011-07-21 12:20
0

根据查找当前记录的排序规则(顺序也不能变),然后再查找上一条和下一条

对了,news_id是不是标识列?

杯具程序员 | 园豆:1718 (小虾三级) | 2011-07-21 13:24
0

前一条:

select top 1 * from news where Ordered <=[current order id] and ID>[current id] Ordered desc,Id asc

后一条:

select top 1 * from news where Ordered >=[current order id] and ID<[current id] order by news_id ASC Order by Ordered asc,Id desc
刘鸿海 | 园豆:655 (小虾三级) | 2011-07-21 15:29
当上一条的Ordered 全部相等时得不到想要的值 结果有可能Id<[current id]
支持(0) 反对(0) 小写X | 园豆:145 (初学一级) | 2011-07-22 09:58
你说的对,是有这个问题。
那就分情况判断吧,如果与当前ordered相等的记录范围内能找到前一条和后一条的话就这么做,找不到的话就在where条件只限定ordered,不限定id。这个方法稍微麻烦了些。
还有一个方法,如果是sql server 2005及以上版本的话,可以使用row_number用法.先找到当前行的row_number,再用row_number做条件来筛选记录,在正排序和倒排序。也挺麻烦的。
支持(0) 反对(0) 刘鸿海 | 园豆:655 (小虾三级) | 2011-07-23 08:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册