sql多个关键字搜索,单个关键字出现的次数排序

网站网页 2013-11-13 03:14:05
最近项目需要实现如下:
有一个关键字库 ,在某一条数据中匹配关键字库中的关键字 ,在当前数据中出现的关键字最多的前三个,然后用这三个关键字在同一张表中查找出现类似出现关键字的数据 (取出现次数接近的数据) 有没有懂的啊?帮帮忙给给解决的方法先谢谢了

在线等答:2596062639
...全文
725 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
网站网页 2013-12-02
  • 打赏
  • 举报
回复
引用 20 楼 yupeigu 的回复:
[quote=引用 19 楼 wyj92 的回复:] @yupeigu 如果要增加一个字数接近的条件 需要加点什么啊?
什么叫字数接近呢?[/quote]
某一篇 文章一 中匹配出的关键字: asp - 6次 、aspx - 8次、php - 9次 (记录出现次数最多的关键字 -  asp10次  文章字数 - 68个字)

在其它数据中查找与其相同的文章:

首先查找出:asp、aspx、php  这几个关键字至少每一个出现过一次的文章 

然后再筛选:

1、用记录的 asp次数(6)  和 其它文章 的关键字 asp的次数(5)  计算两个关键字的相差度   

2、用记录的 文章一的字数(68)  和 其它文章 的字数  计算两个相差度 

最后筛选出 关键字次数相差最小和文章字数相差最小的文章 --------------------------------

id       context
5  ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页
6   ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页,aspx是动态网页PHP、PHP
7  ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页

8  ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页是动态网页
结果
id       context               文章字数
8  ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页是动态网页      63
LongRui888 2013-12-02
  • 打赏
  • 举报
回复
引用 19 楼 wyj92 的回复:
@yupeigu 如果要增加一个字数接近的条件 需要加点什么啊?
什么叫字数接近呢?
网站网页 2013-12-02
  • 打赏
  • 举报
回复
@yupeigu 如果要增加一个字数接近的条件 需要加点什么啊?
LongRui888 2013-11-19
  • 打赏
  • 举报
回复
引用 17 楼 wyj92 的回复:
[quote=引用 16 楼 yupeigu 的回复:] [quote=引用 15 楼 wyj92 的回复:]
引用
yupeigu
我这个还可以弄吗?
是这样吗:

 create table key_word(word nvarchar(30))
 
 insert into key_word
 select 'JAVA' union all
 select 'PHP' union all
 select 'asp' union all
 select 'aspx' union all
 select 'FLEX'
 go
 

drop table tb
go
 
create table tb(id int,content nvarchar(max))
 
 
insert into tb
select 5 , 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
union all select 6, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页,aspx是动态网页PHP、PHP'
union all select 7, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
go




;with t
as
(
select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where kw.word in ('asp','aspx','php')
group by id,content,kw.word
),

tt
as
(
select --max(次数) over(PARTITION by id) as max_count,
       min(次数) over(partition by id) as min_count,
       
       id,content,word,次数
from t
)

select id,content
from
(
select *,
       
       --asp的出现次数为6次
       ROW_NUMBER() over(order by abs(次数 - 6 )) as rownum
from tt
where min_count > 0  --次数最少的都大于0,说明所有关键字的次数都大于0
)t
where rownum = 1   
      and word = 'asp'   
/*
id	content
5	ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页
*/      
[/quote] sql2000 的写啊? [/quote] 改成适合2000的了,用了临时表:

 create table key_word(word nvarchar(30))
 
 insert into key_word
 select 'JAVA' union all
 select 'PHP' union all
 select 'asp' union all
 select 'aspx' union all
 select 'FLEX'
 go
 

drop table tb
go
 
create table tb(id int,content nvarchar(max))
 
 
insert into tb
select 5 , 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
union all select 6, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页,aspx是动态网页PHP、PHP'
union all select 7, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
go


If OBJECT_ID('tempdb..#t') is not null
   drop table #t

If OBJECT_ID('tempdb..#tt') is not null
   drop table #tt
   

select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
       into #t
from tb
inner join key_word kw
        on 1=1
where kw.word in ('asp','aspx','php')
group by id,content,kw.word



select t.id,content,word,次数,min_count
       into #tt
from #t t
inner join
(
  select id,min(次数) min_count
  from #t
  group by id
)tt
 on t.ID = tt.ID



select top 1 *
from #tt
where min_count > 0  --次数最少的都大于0,说明所有关键字的次数都大于0
      and word = 'asp' 
order by abs(次数 - 6 ) 
 
/*
id	content
5	ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页
*/      
网站网页 2013-11-19
  • 打赏
  • 举报
回复
引用 16 楼 yupeigu 的回复:
[quote=引用 15 楼 wyj92 的回复:]
引用
yupeigu
我这个还可以弄吗?
是这样吗:

 create table key_word(word nvarchar(30))
 
 insert into key_word
 select 'JAVA' union all
 select 'PHP' union all
 select 'asp' union all
 select 'aspx' union all
 select 'FLEX'
 go
 

drop table tb
go
 
create table tb(id int,content nvarchar(max))
 
 
insert into tb
select 5 , 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
union all select 6, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页,aspx是动态网页PHP、PHP'
union all select 7, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
go




;with t
as
(
select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where kw.word in ('asp','aspx','php')
group by id,content,kw.word
),

tt
as
(
select --max(次数) over(PARTITION by id) as max_count,
       min(次数) over(partition by id) as min_count,
       
       id,content,word,次数
from t
)

select id,content
from
(
select *,
       
       --asp的出现次数为6次
       ROW_NUMBER() over(order by abs(次数 - 6 )) as rownum
from tt
where min_count > 0  --次数最少的都大于0,说明所有关键字的次数都大于0
)t
where rownum = 1   
      and word = 'asp'   
/*
id	content
5	ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页
*/      
[/quote] sql2000 的写啊?
LongRui888 2013-11-18
  • 打赏
  • 举报
回复
需要先建个函数,用来在某个字符串,查找某个关键词出现的次数:

--1.函数
if exists(select * from sys.objects where name = 'f_searchSTR' and type = 'tf')
   drop function dbo.f_searchSTR
go

create function dbo.f_searchSTR
(
	@s varchar(max),     --要分拆的字符串
	@search varchar(30)    --分隔字符
) 
returns int
as
begin   
  declare @len int
  declare @i int;  
  
  set @i = 0;

  while CHARINDEX(@search,@s) >0
  begin
    set @i = @i + 1
    
    set @s = stuff(@s,CHARINDEX(@search,@s),len(@search),'')
  end
  
  return @i  
end
go  
然后是查询:
 
 create table key_word(word nvarchar(30))
 
 insert into key_word
 select 'JAVA' union all
 select 'PHP' union all
 select 'asp' union all
 select 'aspx' union all
 select 'FLEX'
 go
 

drop table tb
go
 
create table tb(id int,content nvarchar(max))
 
 
insert into tb
select  1,'JAVA是面对对象的语言,java阿斯蒂芬到发斯蒂芬撒旦php了空间和空间空间php了空间和空间空间'
union all select  2,'PHP学起来比JAVA要容易点asp了互动粉卡萨帝合肥PHP了看见了看见了健康路家'
union all select  3,'ASP比PHP用起来简单,PHP比JAVA用起来简单'
union all select  4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用'
union all select  5,'ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页'
go



select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id = 5
group by id,content,kw.word
/*
id	content	                                                                                word	次数
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	asp	    3
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	aspx	1
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	FLEX	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	JAVA	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	PHP	    3
*/
      
网站网页 2013-11-18
  • 打赏
  • 举报
回复
引用 6 楼 yupeigu 的回复:
[quote=引用 5 楼 wyj92 的回复:] 就这么沉了 - -
其实你这个,如果用程序来做,可能更好, 比如,你要查询某个字符串中,出现了asp的个数,这个在sql server中不方便来比较,只能是通过一个循环,来查,效率不是很好[/quote] 这个应该只能 在文章中查找存在的关键字 , 那如何在数据库中检索 查找出来的关键字 并按每个关键字出现的次数 排序
LongRui888 2013-11-18
  • 打赏
  • 举报
回复
引用 5 楼 wyj92 的回复:
就这么沉了 - -
其实你这个,如果用程序来做,可能更好, 比如,你要查询某个字符串中,出现了asp的个数,这个在sql server中不方便来比较,只能是通过一个循环,来查,效率不是很好
LongRui888 2013-11-18
  • 打赏
  • 举报
回复
引用 15 楼 wyj92 的回复:
引用
yupeigu
我这个还可以弄吗?
是这样吗:

 create table key_word(word nvarchar(30))
 
 insert into key_word
 select 'JAVA' union all
 select 'PHP' union all
 select 'asp' union all
 select 'aspx' union all
 select 'FLEX'
 go
 

drop table tb
go
 
create table tb(id int,content nvarchar(max))
 
 
insert into tb
select 5 , 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
union all select 6, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页,aspx是动态网页PHP、PHP'
union all select 7, 'ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页'
go




;with t
as
(
select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where kw.word in ('asp','aspx','php')
group by id,content,kw.word
),

tt
as
(
select --max(次数) over(PARTITION by id) as max_count,
       min(次数) over(partition by id) as min_count,
       
       id,content,word,次数
from t
)

select id,content
from
(
select *,
       
       --asp的出现次数为6次
       ROW_NUMBER() over(order by abs(次数 - 6 )) as rownum
from tt
where min_count > 0  --次数最少的都大于0,说明所有关键字的次数都大于0
)t
where rownum = 1   
      and word = 'asp'   
/*
id	content
5	ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页
*/      
网站网页 2013-11-18
  • 打赏
  • 举报
回复
引用
yupeigu
我这个还可以弄吗?
网站网页 2013-11-18
  • 打赏
  • 举报
回复
引用 13 楼 yupeigu 的回复:
[quote=引用 12 楼 wyj92 的回复:] [quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 wyj92 的回复:] [quote=引用 8 楼 yupeigu 的回复:] 需要先建个函数,用来在某个字符串,查找某个关键词出现的次数:

--1.函数
if exists(select * from sys.objects where name = 'f_searchSTR' and type = 'tf')
   drop function dbo.f_searchSTR
go

create function dbo.f_searchSTR
(
	@s varchar(max),     --要分拆的字符串
	@search varchar(30)    --分隔字符
) 
returns int
as
begin   
  declare @len int
  declare @i int;  
  
  set @i = 0;

  while CHARINDEX(@search,@s) >0
  begin
    set @i = @i + 1
    
    set @s = stuff(@s,CHARINDEX(@search,@s),len(@search),'')
  end
  
  return @i  
end
go  
然后是查询:
 
 create table key_word(word nvarchar(30))
 
 insert into key_word
 select 'JAVA' union all
 select 'PHP' union all
 select 'asp' union all
 select 'aspx' union all
 select 'FLEX'
 go
 

drop table tb
go
 
create table tb(id int,content nvarchar(max))
 
 
insert into tb
select  1,'JAVA是面对对象的语言,java阿斯蒂芬到发斯蒂芬撒旦php了空间和空间空间php了空间和空间空间'
union all select  2,'PHP学起来比JAVA要容易点asp了互动粉卡萨帝合肥PHP了看见了看见了健康路家'
union all select  3,'ASP比PHP用起来简单,PHP比JAVA用起来简单'
union all select  4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用'
union all select  5,'ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页'
go



select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id = 5
group by id,content,kw.word
/*
id	content	                                                                                word	次数
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	asp	    3
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	aspx	1
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	FLEX	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	JAVA	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	PHP	    3
*/
      
例如: 在文章一中有 关键字: asp - 4次 、aspx - 6次 再剩余的文章中 如何找到最接近 这个 关键字结果的 数据? [/quote] 但是这个asp和aspx是否有权重呢,是同时满足这2个条件,还是只需要满足一部分就可以,我写的:
;with t
as
(
select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id <> 5
group by id,content,kw.word
),

tt
as
(
select top 1 id
from t
where (word = 'asp' and 次数<=4) or
      (word = 'aspx' and 次数<=6)
order by 次数 desc
)

select *
from tb
where id in (select id from tt)
[/quote] 有了权重是不是能更简单的查找数据,但是对权重的计算 不知道怎么弄 这个关键:是根据某一条文章 在数据匹配出来的 是动态的 应该不能写死 再匹配出来的关键字及其次数 在查找的另一篇文章中 每一个关键字至少出现一次 然后降序 取第一条数据 ------------------------------- 需求就是这样 (用一篇文章区匹配另一篇文章 -- 他们之间的联系就是出现的相同的关键字和每个关键字出现的次数)[/quote] 现在的问题是,有可能这个文章,有asp,但没有apsx,所以,如果需要每个关键字只是出现一次,是只有有一个关键字出现就可以了,还是多个关键字都必须要同时出现呢[/quote]
引用 13 楼 yupeigu 的回复:
[quote=引用 12 楼 wyj92 的回复:] [quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 wyj92 的回复:] [quote=引用 8 楼 yupeigu 的回复:] 需要先建个函数,用来在某个字符串,查找某个关键词出现的次数:

--1.函数
if exists(select * from sys.objects where name = 'f_searchSTR' and type = 'tf')
   drop function dbo.f_searchSTR
go

create function dbo.f_searchSTR
(
	@s varchar(max),     --要分拆的字符串
	@search varchar(30)    --分隔字符
) 
returns int
as
begin   
  declare @len int
  declare @i int;  
  
  set @i = 0;

  while CHARINDEX(@search,@s) >0
  begin
    set @i = @i + 1
    
    set @s = stuff(@s,CHARINDEX(@search,@s),len(@search),'')
  end
  
  return @i  
end
go  
然后是查询:
 
 create table key_word(word nvarchar(30))
 
 insert into key_word
 select 'JAVA' union all
 select 'PHP' union all
 select 'asp' union all
 select 'aspx' union all
 select 'FLEX'
 go
 

drop table tb
go
 
create table tb(id int,content nvarchar(max))
 
 
insert into tb
select  1,'JAVA是面对对象的语言,java阿斯蒂芬到发斯蒂芬撒旦php了空间和空间空间php了空间和空间空间'
union all select  2,'PHP学起来比JAVA要容易点asp了互动粉卡萨帝合肥PHP了看见了看见了健康路家'
union all select  3,'ASP比PHP用起来简单,PHP比JAVA用起来简单'
union all select  4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用'
union all select  5,'ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页'
go



select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id = 5
group by id,content,kw.word
/*
id	content	                                                                                word	次数
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	asp	    3
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	aspx	1
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	FLEX	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	JAVA	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	PHP	    3
*/
      
例如: 在文章一中有 关键字: asp - 4次 、aspx - 6次 再剩余的文章中 如何找到最接近 这个 关键字结果的 数据? [/quote] 但是这个asp和aspx是否有权重呢,是同时满足这2个条件,还是只需要满足一部分就可以,我写的:
;with t
as
(
select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id <> 5
group by id,content,kw.word
),

tt
as
(
select top 1 id
from t
where (word = 'asp' and 次数<=4) or
      (word = 'aspx' and 次数<=6)
order by 次数 desc
)

select *
from tb
where id in (select id from tt)
[/quote] 有了权重是不是能更简单的查找数据,但是对权重的计算 不知道怎么弄 这个关键:是根据某一条文章 在数据匹配出来的 是动态的 应该不能写死 再匹配出来的关键字及其次数 在查找的另一篇文章中 每一个关键字至少出现一次 然后降序 取第一条数据 ------------------------------- 需求就是这样 (用一篇文章区匹配另一篇文章 -- 他们之间的联系就是出现的相同的关键字和每个关键字出现的次数)[/quote] 现在的问题是,有可能这个文章,有asp,但没有apsx,所以,如果需要每个关键字只是出现一次,是只有有一个关键字出现就可以了,还是多个关键字都必须要同时出现呢[/quote] ------------------------------------------------------------------------------------ 啊 - - 坑爹 小变了下需求 某一篇文章一中匹配出的关键字: asp - 6次 、aspx - 8次、php - 9次 (记录出现次数最多的关键字 - asp10次 ) 在其它数据中查找与其相同的文章: 首先查找出:asp、aspx、php 这几个关键字至少每一个出现过一次的文章 然后再筛选:用记录的 asp次数(6) 和 其它文章 的关键字 asp的次数(5) 计算两个关键字的相差度 最后筛选出 相差最小的文章 -------------------------------- 结果: /* 合格结果-------------------- id content word 次数 5 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页 asp 5 5 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页 aspx 1 5 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页 php 1 不合格结果-------------------- id content word 次数 6 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页,aspx是动态网页PHP、PHP asp 8 6 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页 ,aspx是动态网页PHP、PHP aspx 2 6 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,做网页都不错ASP,aspx是动态网页 ,aspx是动态网页PHP、PHP php 3 不合格结果-------------------- id content word 次数 7 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页 asp 3 7 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页 aspx 1 7 ASP,PHP用来做网页都不错ASP,做网页都不错ASP,aspx是动态网页 php 1 */
LongRui888 2013-11-18
  • 打赏
  • 举报
回复
引用 12 楼 wyj92 的回复:
[quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 wyj92 的回复:] [quote=引用 8 楼 yupeigu 的回复:] 需要先建个函数,用来在某个字符串,查找某个关键词出现的次数:

--1.函数
if exists(select * from sys.objects where name = 'f_searchSTR' and type = 'tf')
   drop function dbo.f_searchSTR
go

create function dbo.f_searchSTR
(
	@s varchar(max),     --要分拆的字符串
	@search varchar(30)    --分隔字符
) 
returns int
as
begin   
  declare @len int
  declare @i int;  
  
  set @i = 0;

  while CHARINDEX(@search,@s) >0
  begin
    set @i = @i + 1
    
    set @s = stuff(@s,CHARINDEX(@search,@s),len(@search),'')
  end
  
  return @i  
end
go  
然后是查询:
 
 create table key_word(word nvarchar(30))
 
 insert into key_word
 select 'JAVA' union all
 select 'PHP' union all
 select 'asp' union all
 select 'aspx' union all
 select 'FLEX'
 go
 

drop table tb
go
 
create table tb(id int,content nvarchar(max))
 
 
insert into tb
select  1,'JAVA是面对对象的语言,java阿斯蒂芬到发斯蒂芬撒旦php了空间和空间空间php了空间和空间空间'
union all select  2,'PHP学起来比JAVA要容易点asp了互动粉卡萨帝合肥PHP了看见了看见了健康路家'
union all select  3,'ASP比PHP用起来简单,PHP比JAVA用起来简单'
union all select  4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用'
union all select  5,'ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页'
go



select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id = 5
group by id,content,kw.word
/*
id	content	                                                                                word	次数
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	asp	    3
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	aspx	1
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	FLEX	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	JAVA	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	PHP	    3
*/
      
例如: 在文章一中有 关键字: asp - 4次 、aspx - 6次 再剩余的文章中 如何找到最接近 这个 关键字结果的 数据? [/quote] 但是这个asp和aspx是否有权重呢,是同时满足这2个条件,还是只需要满足一部分就可以,我写的:
;with t
as
(
select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id <> 5
group by id,content,kw.word
),

tt
as
(
select top 1 id
from t
where (word = 'asp' and 次数<=4) or
      (word = 'aspx' and 次数<=6)
order by 次数 desc
)

select *
from tb
where id in (select id from tt)
[/quote] 有了权重是不是能更简单的查找数据,但是对权重的计算 不知道怎么弄 这个关键:是根据某一条文章 在数据匹配出来的 是动态的 应该不能写死 再匹配出来的关键字及其次数 在查找的另一篇文章中 每一个关键字至少出现一次 然后降序 取第一条数据 ------------------------------- 需求就是这样 (用一篇文章区匹配另一篇文章 -- 他们之间的联系就是出现的相同的关键字和每个关键字出现的次数)[/quote] 现在的问题是,有可能这个文章,有asp,但没有apsx,所以,如果需要每个关键字只是出现一次,是只有有一个关键字出现就可以了,还是多个关键字都必须要同时出现呢
网站网页 2013-11-18
  • 打赏
  • 举报
回复
引用 11 楼 yupeigu 的回复:
[quote=引用 9 楼 wyj92 的回复:] [quote=引用 8 楼 yupeigu 的回复:] 需要先建个函数,用来在某个字符串,查找某个关键词出现的次数:

--1.函数
if exists(select * from sys.objects where name = 'f_searchSTR' and type = 'tf')
   drop function dbo.f_searchSTR
go

create function dbo.f_searchSTR
(
	@s varchar(max),     --要分拆的字符串
	@search varchar(30)    --分隔字符
) 
returns int
as
begin   
  declare @len int
  declare @i int;  
  
  set @i = 0;

  while CHARINDEX(@search,@s) >0
  begin
    set @i = @i + 1
    
    set @s = stuff(@s,CHARINDEX(@search,@s),len(@search),'')
  end
  
  return @i  
end
go  
然后是查询:
 
 create table key_word(word nvarchar(30))
 
 insert into key_word
 select 'JAVA' union all
 select 'PHP' union all
 select 'asp' union all
 select 'aspx' union all
 select 'FLEX'
 go
 

drop table tb
go
 
create table tb(id int,content nvarchar(max))
 
 
insert into tb
select  1,'JAVA是面对对象的语言,java阿斯蒂芬到发斯蒂芬撒旦php了空间和空间空间php了空间和空间空间'
union all select  2,'PHP学起来比JAVA要容易点asp了互动粉卡萨帝合肥PHP了看见了看见了健康路家'
union all select  3,'ASP比PHP用起来简单,PHP比JAVA用起来简单'
union all select  4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用'
union all select  5,'ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页'
go



select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id = 5
group by id,content,kw.word
/*
id	content	                                                                                word	次数
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	asp	    3
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	aspx	1
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	FLEX	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	JAVA	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	PHP	    3
*/
      
例如: 在文章一中有 关键字: asp - 4次 、aspx - 6次 再剩余的文章中 如何找到最接近 这个 关键字结果的 数据? [/quote] 但是这个asp和aspx是否有权重呢,是同时满足这2个条件,还是只需要满足一部分就可以,我写的:
;with t
as
(
select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id <> 5
group by id,content,kw.word
),

tt
as
(
select top 1 id
from t
where (word = 'asp' and 次数<=4) or
      (word = 'aspx' and 次数<=6)
order by 次数 desc
)

select *
from tb
where id in (select id from tt)
[/quote] 有了权重是不是能更简单的查找数据,但是对权重的计算 不知道怎么弄 这个关键:是根据某一条文章 在数据匹配出来的 是动态的 应该不能写死 再匹配出来的关键字及其次数 在查找的另一篇文章中 每一个关键字至少出现一次 然后降序 取第一条数据 ------------------------------- 需求就是这样 (用一篇文章区匹配另一篇文章 -- 他们之间的联系就是出现的相同的关键字和每个关键字出现的次数)
LongRui888 2013-11-18
  • 打赏
  • 举报
回复
引用 9 楼 wyj92 的回复:
[quote=引用 8 楼 yupeigu 的回复:] 需要先建个函数,用来在某个字符串,查找某个关键词出现的次数:

--1.函数
if exists(select * from sys.objects where name = 'f_searchSTR' and type = 'tf')
   drop function dbo.f_searchSTR
go

create function dbo.f_searchSTR
(
	@s varchar(max),     --要分拆的字符串
	@search varchar(30)    --分隔字符
) 
returns int
as
begin   
  declare @len int
  declare @i int;  
  
  set @i = 0;

  while CHARINDEX(@search,@s) >0
  begin
    set @i = @i + 1
    
    set @s = stuff(@s,CHARINDEX(@search,@s),len(@search),'')
  end
  
  return @i  
end
go  
然后是查询:
 
 create table key_word(word nvarchar(30))
 
 insert into key_word
 select 'JAVA' union all
 select 'PHP' union all
 select 'asp' union all
 select 'aspx' union all
 select 'FLEX'
 go
 

drop table tb
go
 
create table tb(id int,content nvarchar(max))
 
 
insert into tb
select  1,'JAVA是面对对象的语言,java阿斯蒂芬到发斯蒂芬撒旦php了空间和空间空间php了空间和空间空间'
union all select  2,'PHP学起来比JAVA要容易点asp了互动粉卡萨帝合肥PHP了看见了看见了健康路家'
union all select  3,'ASP比PHP用起来简单,PHP比JAVA用起来简单'
union all select  4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用'
union all select  5,'ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页'
go



select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id = 5
group by id,content,kw.word
/*
id	content	                                                                                word	次数
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	asp	    3
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	aspx	1
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	FLEX	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	JAVA	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	PHP	    3
*/
      
例如: 在文章一中有 关键字: asp - 4次 、aspx - 6次 再剩余的文章中 如何找到最接近 这个 关键字结果的 数据? [/quote] 但是这个asp和aspx是否有权重呢,是同时满足这2个条件,还是只需要满足一部分就可以,我写的:
;with t
as
(
select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id <> 5
group by id,content,kw.word
),

tt
as
(
select top 1 id
from t
where (word = 'asp' and 次数<=4) or
      (word = 'aspx' and 次数<=6)
order by 次数 desc
)

select *
from tb
where id in (select id from tt)
网站网页 2013-11-18
  • 打赏
  • 举报
回复
引用 9 楼 wyj92 的回复:
[quote=引用 8 楼 yupeigu 的回复:] 需要先建个函数,用来在某个字符串,查找某个关键词出现的次数:

--1.函数
if exists(select * from sys.objects where name = 'f_searchSTR' and type = 'tf')
   drop function dbo.f_searchSTR
go

create function dbo.f_searchSTR
(
	@s varchar(max),     --要分拆的字符串
	@search varchar(30)    --分隔字符
) 
returns int
as
begin   
  declare @len int
  declare @i int;  
  
  set @i = 0;

  while CHARINDEX(@search,@s) >0
  begin
    set @i = @i + 1
    
    set @s = stuff(@s,CHARINDEX(@search,@s),len(@search),'')
  end
  
  return @i  
end
go  
然后是查询:
 
 create table key_word(word nvarchar(30))
 
 insert into key_word
 select 'JAVA' union all
 select 'PHP' union all
 select 'asp' union all
 select 'aspx' union all
 select 'FLEX'
 go
 

drop table tb
go
 
create table tb(id int,content nvarchar(max))
 
 
insert into tb
select  1,'JAVA是面对对象的语言,java阿斯蒂芬到发斯蒂芬撒旦php了空间和空间空间php了空间和空间空间'
union all select  2,'PHP学起来比JAVA要容易点asp了互动粉卡萨帝合肥PHP了看见了看见了健康路家'
union all select  3,'ASP比PHP用起来简单,PHP比JAVA用起来简单'
union all select  4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用'
union all select  5,'ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页'
go



select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id = 5
group by id,content,kw.word
/*
id	content	                                                                                word	次数
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	asp	    3
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	aspx	1
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	FLEX	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	JAVA	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	PHP	    3
*/
      
例如: 在文章一中有 关键字: asp - 4次 、aspx - 6次 再剩余的文章中 如何找到最接近 这个 关键字结果的 数据? [/quote] 在其他文章中查找接近的 关键字:asp 、aspx 至少存在一次 如: asp - 1次 、aspx - 0次 这种文章 就不能被查出来
网站网页 2013-11-18
  • 打赏
  • 举报
回复
引用 8 楼 yupeigu 的回复:
需要先建个函数,用来在某个字符串,查找某个关键词出现的次数:

--1.函数
if exists(select * from sys.objects where name = 'f_searchSTR' and type = 'tf')
   drop function dbo.f_searchSTR
go

create function dbo.f_searchSTR
(
	@s varchar(max),     --要分拆的字符串
	@search varchar(30)    --分隔字符
) 
returns int
as
begin   
  declare @len int
  declare @i int;  
  
  set @i = 0;

  while CHARINDEX(@search,@s) >0
  begin
    set @i = @i + 1
    
    set @s = stuff(@s,CHARINDEX(@search,@s),len(@search),'')
  end
  
  return @i  
end
go  
然后是查询:
 
 create table key_word(word nvarchar(30))
 
 insert into key_word
 select 'JAVA' union all
 select 'PHP' union all
 select 'asp' union all
 select 'aspx' union all
 select 'FLEX'
 go
 

drop table tb
go
 
create table tb(id int,content nvarchar(max))
 
 
insert into tb
select  1,'JAVA是面对对象的语言,java阿斯蒂芬到发斯蒂芬撒旦php了空间和空间空间php了空间和空间空间'
union all select  2,'PHP学起来比JAVA要容易点asp了互动粉卡萨帝合肥PHP了看见了看见了健康路家'
union all select  3,'ASP比PHP用起来简单,PHP比JAVA用起来简单'
union all select  4,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用'
union all select  5,'ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页'
go



select id,
       content,
       kw.word,
       dbo.f_searchSTR(tb.content,kw.word) 次数
from tb
cross join key_word kw
where id = 5
group by id,content,kw.word
/*
id	content	                                                                                word	次数
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	asp	    3
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	aspx	1
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	FLEX	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	JAVA	0
5	ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页	PHP	    3
*/
      
例如: 在文章一中有 关键字: asp - 4次 、aspx - 6次 再剩余的文章中 如何找到最接近 这个 关键字结果的 数据?
网站网页 2013-11-15
  • 打赏
  • 举报
回复
就这么沉了 - -
网站网页 2013-11-13
  • 打赏
  • 举报
回复

关键字库:JAVA、PHP、asp、aspx、FLEX

 ID        CONTENT

 1         JAVA是面对对象的语言,java阿斯蒂芬到发斯蒂芬撒旦php了空间和空间空间php了空间和空间空间

 2         PHP学起来比JAVA要容易点asp了互动粉卡萨帝合肥PHP了看见了看见了健康路家

 3         ASP比PHP用起来简单,PHP比JAVA用起来简单

 4         FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用

 5         ASP,PHP用来做网页都不错ASP,PHP都是动态网页阿斯顿发房间撒地方PHP都是动态网页aspx也是动态网页


一、如果当前查看的是 5  存在在关键字中的 有 asp、php、aspx (我们取出现次数最多的前两个关键字)  结果:asp(2次)、php(3次)

二、此时利用 5  匹配出的关键(asp、php) 在其他剩余4条数据中检索 出现次数 和 一 最接近的数据  结果: 3 (asp-1次、php-2次)
發糞塗牆 2013-11-13
  • 打赏
  • 举报
回复
表的列,用于测试的数据或者你的真实数据,不然都没有直观的东西。靠猜测你的情况写出来也是浪费时间
网站网页 2013-11-13
  • 打赏
  • 举报
回复
数据、表结构 ??? 什么意思啊?没懂
加载更多回复(1)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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