假设我有一个带有两列的“标签”表: tagid contentid 。每行代表分配给一条内容的标签。我想要一个查询,该查询将为我提供标记为334、338和342的每段内容的contentid。

做到这一点的“简单”方法是(伪代码):

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也涵盖了这一点。

最佳答案

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

关于SQL查询: Simulating an "AND" over several rows instead of sub-querying,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/163887/

10-13 08:53