首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请教如何得到新闻分类表中的每类前2条数据

2012-01-23 
请问怎么得到新闻分类表中的每类前2条数据!我有一个新闻表.如下:id(自动编号)classid(分类id)112132435262

请问怎么得到新闻分类表中的每类前2条数据!
我有一个新闻表.如下:
id(自动编号)       classid(分类id)
1                                       1
2                                       1
3                                       2
4                                       3
5                                       2
6                                       2
7                                       3
8                                       4
9                                       1
....
我现要想用一条sql语句查得如下结果:
id(自动编号)       classid(分类id)
1                                       1
2                                       1
3                                       2
5                                       2
4                                       3
7                                       3
8                                       4
------------------------------------
classid的编号数是不确定的.请问偶这个sql要怎么做?
我要做的效果就是一次查新闻分类中每个分类的前两条数据.
先谢!


[解决办法]
--原始数据:@news
declare @news table(id int,classid int)
insert @news
select 1,1 union all
select 2,1 union all
select 3,2 union all
select 4,3 union all
select 5,2 union all
select 6,2 union all
select 7,3 union all
select 8,4 union all
select 9,1

select * from @news a where id in (select top 2 id from @news where classid=a.classid) order by classid,id

/*
1 1
2 1
3 2
5 2
4 3
7 3
8 4
*/

[解决办法]
正解
[解决办法]
---方法1
Select * From 新闻表 As A Where id In
(Select Top 2 id From 新闻表 Where Classid=A.Classid Order By id)
Order By Classid,id

---方法2
Select * From 新闻表 As A Where
(Select Count(1) From 新闻表 Where Classid=A.Classid And id <=A.id Group By Classid) <3


Order By Classid,id

---方法3
Select * From 新闻表 As A Where Not Exists
(Select 1 From 新闻表 Where Classid=A.Classid And id <=A.id Group By Classid Having Count(1)> 2)
Order By Classid,id
[解决办法]
这个是手动插入吗?
我哪个表里面不确定有多少数据,这样手动插入不行吧!
---------------------------------------------
---试试上面三种方法的任何一种,看结果!!!!
[解决办法]
I服了U。

实测数据我不手动插入它能凭空生成呀。

select * from @news a where id in (select top 2 id from @news where classid=a.classid) order by classid,id

@news -> 实际表名
id -> 实际字段名
classid -> 实际字段名

如果实际上不行,那就是不行;如果实际行,那就是行。

行与不行,不是凭空猜测的。
[解决办法]
我把A.Classid写在Classid就 自己分类号等于自己就查不出正确结果了,这是什么?A表只是个别名嘛
-------------------
你自己=自己那肯定不行啊,A是第一个From 新闻表的别名
第一种方法应该是最好理解的
方法2和方法3都是用count(1)记录数来限制
方法2使用的 <3就是count()值等于0,1,2
方法3使用的不大于2,也是count()值等于0,1,2.
[解决办法]
运行下面两个语句,看看相同的classid的count()值,对照方法2和方法3看看你就会明白了
----方法2的count()值
Select *,(Select Count(1) From 新闻表 Where classid = A.classid And id <=A.id ) As 'count值 '
From 新闻表 As A
Order By classid,id

----方法3的count()值
Select *,IsNull((Select Count(*) From 新闻表 Where classid = A.classid And id> =A.id Group By classid),0) As 'count值 '
From 新闻表 As A
Order By classid,id

热点排行