日期:2014-05-17  浏览次数:20523 次

多个关键词匹配多个关键词的问题。
有张新闻表,有一个Tags字段,存放相关词,多个词用,分隔。。。现在想把相似的Tags显示在一起。。。

如第一条可能是:汽车,银行
第二条:银行,黄金
第三条:汽车
第四条:美食
...........................

比如显示第一条新闻的时候,相关新闻可以把第二条,第三条都显示出来。。。就是关键词有一个能对应上就可以。。。
求SQL。。。。

------解决方案--------------------

create table 新闻表(Id int, Tags varchar(50))

insert into 新闻表
select 1, '汽车,银行' union all
select 2, '银行,黄金' union all
select 3, '汽车' union all
select 4, '美食'

-- 第一条新闻
select Id, Tags
 from 新闻表
 where Id=1

-- 相关新闻
select distinct c.Id, c.Tags
 from 新闻表 c
 inner join
(select substring(a.Tags,b.number,charindex(',',a.Tags+',',b.number)-b.number) 'TagItem'
 from 新闻表 a
 inner join master.dbo.spt_values b
 on b.[type]='P' and b.number between 1 and len(a.Tags) and substring(','+a.Tags,b.number,1) = ','
 where a.Id=1) d on charindex(d.TagItem,c.Tags,1)>0
where c.Id<>1

/*
Id          Tags
----------- --------------------------------------------------
2           银行,黄金
3           汽车

(2 row(s) affected)
*/

------解决方案--------------------

CREATE TABLE t1
(
id INT,
col VARCHAR(20)
)
INSERT INTO t1
SELECT 1,'汽车,银行' UNION ALL
SELECT 2,'银行,黄金' UNION ALL
SELECT 3,'汽车' UNION ALL
SELECT 4,'美食'
SELECT * FROM t1

;WITH AAA AS
(
SELECT SUBSTRING(A.col,B.number,CHARINDEX(',',A.col+',',B.number)-B.number) AS col
FROM t1 AS A WITH(NOLOCK) INNER JOIN
master..spt_values AS B ON B.number<=DATALENGTH(A.col)+1
AND SUBSTRING(','+A.col,B.number,1)=','
AND A.id=1
AND B.[type]='P'
)
SELECT A.*
FROM t1 AS A INNER JOIN
AAA AS B ON CHARINDEX(B.col,A.col)>0
AND A.id>1


id col
3 汽车
2 银行,黄金