假设我有一个带有两列的"tags"表:tagid和contentid.每行代表分配给一段内容的标签.我想要一个查询,它将为我提供标记有标记334,338和342的每个内容的争用.
执行此操作的"简单"方法是(伪代码):
select contentid from tags where tagid = 334 and contentid in ( select contentid from tags where tagid = 338 and contentid in ( select contentid from tags where tagid = 342 ) )
然而,我的直觉告诉我,有一种更好,更快,更可扩展的方法来做到这一点.例如,如果我需要找到12个标签的交集怎么办?这很快就会变得可怕.有任何想法吗?
编辑:事实证明这也包含在这篇优秀的博客文章中.
SELECT contentID FROM tags WHERE tagID in (334, 338, 342) GROUP BY contentID HAVING COUNT(DISTINCT tagID) = 3 --In general SELECT contentID FROM tags WHERE tagID in (...) --taglist GROUP BY contentID HAVING COUNT(DISTINCT tagID) = ... --tagcount