假设我有一个带两列的“标签”表:tagid和contentid。每一行代表分配给一段内容的标签。我想要一个查询,这将使我的每一条内容被标记为tagids 334,338的内容识别,和342SQL查询:在几行而不是子查询中模拟“AND”
“易”的方式来做到这将是(伪):
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个标签的交集?这很快就会变得可怕。有任何想法吗?
编辑:原来这也包括在this excellent blog post。
就是这样。虽然如果tagid,contentid是唯一的,那么COUNT中可能不需要DISTINCT(DISTINCT tagID) – tzot 2008-10-02 18:44:04
非常聪明的解决方案,但它需要对我们安装的SQL2000进行调整。如果没有select子句中的聚合,我们不能使用“having”。很容易解决,虽然。 – 2008-10-02 18:49:48
这将工作在MySQL和Oracle? – 2008-10-02 19:00:50