给定下表(描述多对多关系):
身份证 | 页面ID | 标签ID -------------------- 1 | 1 | 1 2 | 1 | 2 3 | 2 | 2 4 | 2 | 3
我如何选择“具有所有TagID列表的所有 PageID”?
换句话说:我想要所有用 TagIDs 1 和 2 标记的页面(所以在这个例子中它只有 PageID 1)
经过一番谷歌搜索后,我发现这里可能相关的术语“关系划分”,但我不太明白。有人对我的问题有简单的查询吗?
给定下表(描述多对多关系):
身份证 | 页面ID | 标签ID -------------------- 1 | 1 | 1 2 | 1 | 2 3 | 2 | 2 4 | 2 | 3
我如何选择“具有所有TagID列表的所有 PageID”?
换句话说:我想要所有用 TagIDs 1 和 2 标记的页面(所以在这个例子中它只有 PageID 1)
经过一番谷歌搜索后,我发现这里可能相关的术语“关系划分”,但我不太明白。有人对我的问题有简单的查询吗?
如果您在表中有 tagid 列表,那么它是一个简单的连接和分组:
select pageId
from t join
list l
on t.tagId = l.tagId cross join
(select count(*) cnt from list l) as const
group by pageId
having count(*) = max(cnt)
having 子句检查所有标签是否存在。如果可能有重复,那么在这两种情况下,您都希望将“count(*)”替换为“count(distinct tagid)”。