MySQL:M:N关系的子集和超集
假设我有文章和标签的典型M:N关系表MySQL:M:N关系的子集和超集,mysql,sql,set,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既不是超集,也不
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 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标记的子集)。您不能直接运行吗
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
函数相关的子查询速度非常慢:(我需要数百万篇文章对使用它。问题是,如果我将它作为子查询运行,它不起作用-MySQL不知何故没有将数据从主查询传递到子查询的on子句(MySQL 5.1.49)。这应该是可行的,因为这是一种常见的技术。如果你不知道如何做,那么在你的主要问题和你的目标中向SO发布一个新问题。