MySQL:M:N关系的子集和超集

时间:2013-11-26 18:06:27

标签: mysql sql set

假设我有文章和标签的典型M:​​N关系表。

 article_id | tag_id
------------+--------
 A1         | T1
 A1         | T2
 A1         | T3
 A2         | T1
 A2         | T2
 A3         | T1
 A3         | T4

在这个例子中,文章A1的标签(T1,T2,T3)是文章A2的标签(T1,T2)的超集。反之亦然,A2的标签是A1的子集。 A3既不是超集,也不是A1或A2标签的子集。

查找AX的标签是否是AY的子集的最有效方法是什么?

2 个答案:

答案 0 :(得分:1)

难道你不能运行

SELECT t1.*
FROM tbl AS t1 
LEFT JOIN tbl as t2
  ON t2.article_id ='A1'
  AND t1.tag_id = t2.tag_id
WHERE t1.article_id = 'A2'
  AND t2.article_id IS NULL;

如果没有返回记录,那么所有A2的标签都在A1中。然后,您可以在使用EXISTSNOT EXISTS函数

的其他查询中使用此功能

答案 1 :(得分:0)

您可以使用带有子查询的查询来测试一个集合是否是另一个集合的子集,如下所示:

select tag_id from tablename where article_id=AX
and tag_id not in (select tag_id from tablename where article_id=AY)

如果查询返回1条或更多条记录,则AX中的标签不在AY中(即AX的标签不是AY标签的子集)。

如果查询返回0条记录,那么AX中没有不在AY中的标签(即AX的标签是AY标签的子集)。