我有一个名为articletag的表用于博客数据库,该表说哪个文章有哪个标记:
Art_Id Tag_id
1 3
2 3
3 3
4 3
1 1
3 1
4 1
2 2
5 5
查看此数据的另一种方法是:
1, "blog", "first"
2, "blog", "second"
3, "blog", "first"
4, "blog", "first"
5, "seaside"
Tag_id 3 ='博客' Tag_id 1 =' first' Tag_id 5 ='海边' Tag_id 2 =' second'
我特意在数据库中的每篇文章和每个单词标签(这些标签都是唯一的,顺便说一句)中寻找任何有两个或更多单词的文章 查看上面的非规范化示例,答案应该是1,3,4,作为具有2个或更多单词的共同文章。这3篇文章清楚地分享了博客"和#34;首先。" 输出应为
art_id
1 3 4
我一直在努力争取这个权利。我想出的最好的方法是使用以下方法查找哪个tag_id显示2次或更多次:
Select a.*
from articletag a
join (
select t.tag_id
from articletag t
group by t.tag_id
having count(*) >=2
) b on b.tag_id = a.tag_id
但我真正想要的是Article_id有两个或更多共同词 有人可以帮忙吗?
答案 0 :(得分:2)
我们可以尝试在这里进行自我加入:
SELECT t1.Art_id, t2.Art_id
FROM articletag t1
INNER JOIN articletag t2
ON t2.Art_id > t1.Art_id AND
t1.Tag_id = t2.Tag_id
GROUP BY
t1.Art_id, t2.Art_id
HAVING
COUNT(DISTINCT t1.Tag_id) >= 2;
请注意,我看到1-3,1-4和3-4是具有两个或多个共同标签的文章。
答案 1 :(得分:0)
试试这个:
declare @x table (art_id int, tag_id int)
insert into @x values
(1, 3),
(2, 3),
(3, 3),
(4, 3),
(1, 1),
(3, 1),
(4, 1),
(2, 2),
(5, 5)
select distinct art_id from (
select [x1].art_id,
COUNT(*) over (partition by [x1].art_id,[x2].art_id) [cnt]
from @x [x1] join @x [x2]
on [x1].tag_id = [x2].tag_id and [x1].art_id <> [x2].art_id
) a where cnt > 1
答案 2 :(得分:0)
您还可以使用cte
查找具有相同组合的Art_Id
;with cte as
(
select Tag_id
from table
group by Tag_id
having count(*) >= 2
)
select t.Art_Id
from cte c inner join table t
on t.Tag_id = c.Tag_id
group by t.Art_Id
having count(*) = (select count(1) from cte)