2016-11-18 152 views
0

对不起,因为混淆标题,但我无法说得更好。仅当与Y配对的每个Z与第一个表中的X配对时,才从两个表X-Z和Y-Z中选择一对值X-Y

我有两个表 - TagsTagGroups。第一个具有以下内容:

P1|a 
P1|b 
P1|c 
P2|a 
P2|c 

而二级以下:

1|b 
1|c 
2|a 
2|c 
2|d 

字母代表的内容P1和P2的标签,数字表示这些标签的群体。我想要做的是获得一对'内容' - '标签组',其中内容包含给定组中的全部标签。对于上面的表格,这只是P1|1 - 由于没有b,P2不匹配1,由于没有d,P1和P2不匹配2。

我该怎么办呢?或者,如果这是不可能的/不可行的,我如何重构我的数据结构来实现这一目标?

+0

MySQL或SQLite的的变化?请删除不相关的标签 – Serg

回答

1
select  t.content 
      ,g.group_id 

from     tags  as t 

      join  taggroups as g 

      on   g.tag = 
         t.tag 

group by t.content 
      ,g.group_id 

having  count(*) = 
      (select count(*) from taggroups as g2 where g2.group_id = g.group_id)    
;    
0

这是一个关系除法查询

CREATE TABLE `Tags` (
    `Cont` TEXT, 
    `Tag` TEXT 
); 
insert into Tags (Cont, Tag) 
values ("P1","a"),("P1","b"),("P1","c"),("P2","a"),("P2","c"); 

CREATE TABLE `TG` (
    `Grp` INTEGER, 
    `Tag` TEXT 
); 
insert into TG (Grp, Tag) 
values (1,"b"),(1,"c"),(2,"a"),(2,"c"),(2,"d"); 

Select c.Cont, g.Grp 
from 
    (select distinct Cont from Tags) c 
join 
    (select distinct Grp from TG) g 
on not exists (select 1 
       from TG g1 
       where g1.Grp=g.Grp 
        and not exists (select 1 
            from Tags c1 
            where c1.Cont=c.Cont 
             and g1.Tag=c1.Tag) 
       ); 
相关问题