在数据库中查找具有2个或更多共同列值的行

时间:2018-03-22 06:59:49

标签: sql sql-server

我有一个名为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有两个或更多共同词 有人可以帮忙吗?

3 个答案:

答案 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;

enter image description here

Demo

请注意,我看到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)