SQL搜索所有已分配所有标记的项目

时间:2016-01-06 12:06:48

标签: sql

我有一个基于标签搜索项目的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; Tagsid, name;和Projectsid, name, description

我想要的是搜索分配了所有3个标签的所有项目。

感谢。

1 个答案:

答案 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
             );