[英]MySQL: Subsets and supersets of M:N relation
假设我有用于文章和标签的典型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标签的子集的最有效方法是什么?
你不能跑步吗
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中。 然后,您可以在另一个具有EXISTS
或NOT EXISTS
函数的查询中使用它
您可以使用带有子查询的查询来测试一组是否为另一组的子集,如下所示:
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的标签的子集)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.