1

给定下表(描述多对多关系):

身份证 | 页面ID | 标签ID
--------------------
1 | 1 | 1
2 | 1 | 2
3 | 2 | 2
4 | 2 | 3

我如何选择“具有所有TagID列表的所有 PageID”?
换句话说:我想要所有用 TagIDs 1 和 2 标记的页面(所以在这个例子中它只有 PageID 1)

经过一番谷歌搜索后,我发现这里可能相关的术语“关系划分”,但我不太明白。有人对我的问题有简单的查询吗?

4

1 回答 1

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)”。

于 2012-08-17T17:11:16.737 回答