我有一个基于标签搜索项目的SQL查询。如果任何标签匹配,它就可以正常工作。
SELECT *
FROM projects
WHERE projects.id IN (SELECT taggable_id
FROM taggings
WHERE taggable_type='Project'
AND taggable_id=projects.id
AND taggings.tag_id IN (1, 2, 3))
有三个表Taggings
,列id, taggable_id, taggable_type, tag_id
; Tags
列id, name
;和Projects
列id, name, description
。
我想要的是搜索分配了所有3个标签的所有项目。
感谢。
答案 0 :(得分:3)
您可以通过计算匹配数量来完成此操作。在与p.id
的比较中,您的子查询是多余的(由IN
和相关子句完成)。这是一种方法:
SELECT p.*
from projects p
WHERE 3 = (SELECT COUNT(*)
FROM taggings t
WHERE t.taggable_type = 'Project' AND
t.taggable_id = p.id AND
t.tag_id IN (1, 2, 3)
);
您也可以使用IN
:
SELECT p.*
from projects p
WHERE p.id = (SELECT t.taggable_id
FROM taggings t
WHERE t.taggable_type = 'Project' AND
t.tag_id IN (1, 2, 3)
GROUP BY t.taggable_id
HAVING COUNT(*) = 3
);