分类查询问题

yudf 2009-01-14 03:23:34
字段
分类 内容
新闻 546546454
通知 8765646546
公告 5643218789
通知 132187694
新闻 5646546
图片 89534897
公告 7264789

现在查询要求把“通知”和“公告”合并,得到最新的10条记录。
请帮忙!
...全文
89 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
PrewinZZZ 2009-01-14
  • 打赏
  • 举报
回复
40 公告 内容
100 通知 内容
39 公告 内容
99 通知 内容
38 公告 内容
98 通知 内容
37 公告 内容
97 通知 内容
36 公告 内容
96 通知 内容
35 公告 内容
95 通知 内容
34 公告 内容
94 通知 内容
33 公告 内容
93 通知 内容
32 公告 内容
92 通知 内容
31 公告 内容
91 通知 内容
PrewinZZZ 2009-01-14
  • 打赏
  • 举报
回复
不用日期了,这样可以,思路有了只需要优化一下,把temp改成临时表就OK了


use purview
declare @i int
set @i=1
while @i<=20
begin
insert into notice_bulletin (class,[content]) values('通知','内容')
set @i=@i+1
end


declare @i int
set @i=1
while @i<=20
begin
insert into notice_bulletin (class,[content]) values('其他','内容')
set @i=@i+1
end


select * from notice_bulletin

declare @i int,@countB int, @countN int
set @i=0
set @countB=convert(int,(select max(id) from notice_bulletin where class='公告'))
set @countN=convert(int,(select max(id) from notice_bulletin where class='通知'))
delete temp
while @i<10
begin
insert into temp(id,class,[content]) select id, class,[content] from
(
select * from notice_bulletin where class='公告' and id=@countB
) a
union all
select * from
(
select * from notice_bulletin where class='通知' and id=@countN
) b
set @i=@i+1
set @countB=@countB-1
set @countN=@countN-1
end

select * from temp
ChinaJiaBing 2009-01-14
  • 打赏
  • 举报
回复

把所有字段都粘出来。。。
oswica 2009-01-14
  • 打赏
  • 举报
回复
有日期就简单了

sql如下:
select top 10 分类,内容 from 表
where 分类='通知' OR 分类='公告'
order by 日期 desc

如果要求分类和公告出现的条数则用以下sql:
select top 5 分类,内容 from 表
where 分类='通知'
order by 日期 desc
union all
select top 5 分类,内容 from 表
where 分类='公告'
order by 日期 desc

具体几个分别调整top 的数值
刚刚忘记一个top 10
yudf 2009-01-14
  • 打赏
  • 举报
回复
有时间字段的
oswica 2009-01-14
  • 打赏
  • 举报
回复
如果要得到最新的数据还需要一个字段 日期
sql如下:
select 分类,内容 from 表
where 分类='通知' OR 分类='公告'
order by 日期 desc

如果要求分类和公告出现的条数则用以下sql:
select top 5 分类,内容 from 表
where 分类='通知'
order by 日期 desc
union all
select top 5 分类,内容 from 表
where 分类='公告'
order by 日期 desc

具体几个分别调整top 的数值

yudf 2009-01-14
  • 打赏
  • 举报
回复
字段
分类 内容
新闻 546546454
通知 8765646546
公告 5643218789
通知 132187694
新闻 5646546
图片 89534897
公告 7264789

现在查询要求把“通知”和“公告”合并,得到最新的10条记录。

结果:
分类 内容
通知 8765646546
公告 5643218789
通知 132187694
公告 7264789

把通知和公告合在一起叫“通知公告”栏目,里面只显示通知和公告,不要改变数据库结构的。
汗!!好象还是没说清楚样的
gonglangdxaiyv 2009-01-14
  • 打赏
  • 举报
回复
保存记录的时候没有时间,那ID总有吧

可以降序查找分类字段等于通知或公告的,top 10 不就行了
PrewinZZZ 2009-01-14
  • 打赏
  • 举报
回复
我的理解是有notice和bulletin两个表
属性都一样id,content



----------循环写入-------

declare @i int
set @i=1
while @i<=20
begin
insert into notice values(@i)
set @i=@i+1
end


select * from bulletin order by id desc

----------循环写入-------

declare @i int
set @i=1
while @i<=20
begin
insert into bulletin values(@i)
set @i=@i+1
end
---------结果----
select * from
(
select top 10 * from notice order by id desc
) notice
union all
select * from
(
select top 10 * from bulletin order by id desc
) bulletin
claro 2009-01-14
  • 打赏
  • 举报
回复
帮顶
-狙击手- 2009-01-14
  • 打赏
  • 举报
回复
合并是什么意思
水族杰纶 2009-01-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yudf 的回复:]
引用 2 楼 wufeng4552 的回复:
引用楼主 yudf 的帖子:
字段
分类 内容
新闻 546546454
通知 8765646546
公告 5643218789
通知 132187694
新闻 5646546
图片 89534897
公告 7264789

现在查询要求把“通知”和“公告”合并,得到最新的10条记录。
请帮忙!

結果什麼樣子~~?


结果:
分类 …
[/Quote]
啥意思?新聞圖片不要?
yudf 2009-01-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wufeng4552 的回复:]
引用楼主 yudf 的帖子:
字段
分类 内容
新闻 546546454
通知 8765646546
公告 5643218789
通知 132187694
新闻 5646546
图片 89534897
公告 7264789

现在查询要求把“通知”和“公告”合并,得到最新的10条记录。
请帮忙!

結果什麼樣子~~?
[/Quote]

结果:
分类 内容
通知 8765646546
公告 5643218789
通知 132187694
公告 7264789
faith10099 2009-01-14
  • 打赏
  • 举报
回复
最新的10条记录?
不好判断,如果数据一直用追加方式,那就是最后的10条记录,否则最新的记录存储哪里,天知道

“通知”和“公告”合并,如何合并?并没有说清楚
水族杰纶 2009-01-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 yudf 的帖子:]
字段
分类 内容
新闻 546546454
通知 8765646546
公告 5643218789
通知 132187694
新闻 5646546
图片 89534897
公告 7264789

现在查询要求把“通知”和“公告”合并,得到最新的10条记录。
请帮忙!
[/Quote]
結果什麼樣子~~?
水族杰纶 2009-01-14
  • 打赏
  • 举报
回复
SQL code问题描述:
无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,
所以,当我们在处理下列要求时,会比较麻烦:
有表tb, 如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即, group by id, 求 value 的和(字符串相加)

1. 旧的解决方法

-- 1. 创建处理函数
CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + value
FROM tb
WHERE id=@id
RETURN STUFF(@r, 1, 1, '')
END
GO
-- 调用函数

SELECt id, values=dbo.f_str(id)
FROM tb
GROUP BY id

-- 2. 新的解决方法
-- 示例数据
DECLARE @t TABLE(id int, value varchar(10))
INSERT @t SELECT 1, 'aa'
UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'ccc'

-- 查询处理
SELECT *
FROM(
SELECT DISTINCT
id
FROM @t
)A
OUTER APPLY(
SELECT
[values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM @t N
WHERE id = A.id
FOR XML AUTO
), '<N value="', ','), '"/>', ''), 1, 1, '')
)N

/*--结果
id values
----------- ----------------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影响)
--*/

--各种字符串分函数

--3.3.1 使用游标法进行字符串合并处理的示例。
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
--定义结果集表变量
DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))

--定义游标并进行合并处理
DECLARE tb CURSOR LOCAL
FOR
SELECT col1,col2 FROM tb ORDER BY col1,col2
DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)
OPEN tb
FETCH tb INTO @col1,@col2
SELECT @col1_old=@col1,@s=''
WHILE @@FETCH_STATUS=0
BEGIN
IF @col1=@col1_old
SELECT @s=@s+','+CAST(@col2 as varchar)
ELSE
BEGIN
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
END
FETCH tb INTO @col1,@col2
END
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
CLOSE tb
DEALLOCATE tb
--显示结果并删除测试数据
SELECT * FROM @t
DROP TABLE tb
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO


/*==============================================*/


--3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
GO

--合并处理函数
CREATE FUNCTION dbo.f_str(@col1 varchar(10))
RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
SET @re=''
SELECT @re=@re+','+CAST(col2 as varchar)
FROM tb
WHERE col1=@col1
RETURN(STUFF(@re,1,1,''))
END
GO

--调用函数
SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
--删除测试
DROP TABLE tb
DROP FUNCTION f_str
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO

/*==============================================*/


--3.3.3 使用临时表实现字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
SELECT col1,col2=CAST(col2 as varchar(100))
INTO #t FROM tb
ORDER BY col1,col2
DECLARE @col1 varchar(10),@col2 varchar(100)
UPDATE #t SET
@col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
@col1=col1,
col2=@col2
SELECT * FROM #t
/*--更新处理后的临时表
col1 col2
---------- -------------
a 1
a 1,2
b 1
b 1,2
b 1,2,3
--*/
--得到最终结果
SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
--删除测试
DROP TABLE tb,#t
GO


/*==============================================*/

--3.3.4.1 每组 <=2 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'c',3

--合并处理
SELECT col1,
col2=CAST(MIN(col2) as varchar)
+CASE
WHEN COUNT(*)=1 THEN ''
ELSE ','+CAST(MAX(col2) as varchar)
END
FROM tb
GROUP BY col1
DROP TABLE tb
/*--结果
col1 col2
---------- ----------
a 1,2
b 1,2
c 3
--*/

--3.3.4.2 每组 <=3 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
UNION ALL SELECT 'c',3

--合并处理
SELECT col1,
col2=CAST(MIN(col2) as varchar)
+CASE
WHEN COUNT(*)=3 THEN ','
+CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar)
ELSE ''
END
+CASE
WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar)
ELSE ''
END
FROM tb a
GROUP BY col1
DROP TABLE tb
/*--结果
col1 col2
---------- ------------
a 1,2
b 1,2,3
c 3
--*/
GO
if not object_id('A') is null
drop table A
Go
Create table A([id] int,[cname] nvarchar(2))
Insert A
select 1,N'张三' union all
select 2,N'李四' union all
select 3,N'王五' union all
select 4,N'蔡六'
Go
--> -->

if not object_id('B') is null
drop table B
Go
Create table B([id] int,[cname] nvarchar(5))
Insert B
select 1,N'1,2,3' union all
select 2,N'3,4'
Go
create function F_str(@cname nvarchar(100))
returns nvarchar(100)
as
begin
select @cname=replace(@cname,ID,[cname]) from A where patindex('%,'+rtrim(ID)+',%',','+@cname+',')>0
return @cname
end
go
select [id],dbo.F_str([cname])[cname] from B

id cname
----------- ----------------------------------------------------------------------------------------------------
1 张三,李四,王五
2 王五,蔡六

(2 個資料列受到影響)

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧