Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找属于多个类别的项目_Sql_Postgresql - Fatal编程技术网

Sql 查找属于多个类别的项目

Sql 查找属于多个类别的项目,sql,postgresql,Sql,Postgresql,我有一个projects表(列id和name),一个categories表(列id和name)和一个join表projects\u categories(列projectid和categories\u id) 我想编写一个查询,返回属于一组类别的所有项目。例如,如果我有 projects id name 1 foo 2 bar 以下查询不返回任何结果: SELECT "projects".* FROM "projects" INNER JOIN "projects_categories"

我有一个
projects
表(列
id
name
),一个
categories
表(列
id
name
)和一个join表
projects\u categories
(列
projectid
categories\u id

我想编写一个查询,返回属于一组类别的所有项目。例如,如果我有

projects id name 1 foo 2 bar 以下查询不返回任何结果:

SELECT "projects".* 
FROM "projects" 
INNER JOIN "projects_categories" ON "projects_categories"."project_id" = "project"."id" 
WHERE "projects_categories"."category_id" = 1
  AND "projects_categories"."category_id" = 2

我理解这些查询返回这些结果的原因,但不知道如何编写所需的查询。

您可以尝试使用
EXISTS

SELECT "p".* 
FROM "projects" "p" 
WHERE EXISTS ( 
    SELECT *
    FROM "projects_categories" "pc" 
    WHERE "pc"."category_id" IN (1, 2)
      AND "pc"."project_id" = "p"."id"
    GROUP BY "pc"."project_id" 
    HAVING  COUNT(DISTINCT "pc"."project_id" ) = 2)
)
或加入:

SELECT "p".* 
FROM "projects" "p" 
JOIN ( 
    SELECT "pc"."project_id" 
    FROM "projects_categories" "pc" 
    WHERE "pc"."category_id" IN (1, 2)
    GROUP BY "pc"."project_id" 
    HAVING  COUNT(DISTINCT "pc"."project_id" ) = 2)
) "tpc" ON "tpc"."project_id" = "p"."id"
SELECT "p".* 
FROM "projects" "p" 
WHERE "p"."id" IN ( 
    SELECT "pc"."project_id"
    FROM "projects_categories" "pc" 
    WHERE "pc"."category_id" IN (1, 2)
    GROUP BY "pc"."project_id" 
    HAVING  COUNT(DISTINCT "pc"."project_id" ) = 2)
)
或中的

SELECT "p".* 
FROM "projects" "p" 
JOIN ( 
    SELECT "pc"."project_id" 
    FROM "projects_categories" "pc" 
    WHERE "pc"."category_id" IN (1, 2)
    GROUP BY "pc"."project_id" 
    HAVING  COUNT(DISTINCT "pc"."project_id" ) = 2)
) "tpc" ON "tpc"."project_id" = "p"."id"
SELECT "p".* 
FROM "projects" "p" 
WHERE "p"."id" IN ( 
    SELECT "pc"."project_id"
    FROM "projects_categories" "pc" 
    WHERE "pc"."category_id" IN (1, 2)
    GROUP BY "pc"."project_id" 
    HAVING  COUNT(DISTINCT "pc"."project_id" ) = 2)
)

问题是,查询正在查找同一个表和列,并试图拥有两个不同的值。这将分离两个不同的条件,然后将它们组合成一个结果集

SELECT  A.ProjectName, A.CategoryId, B.CategoryId 
FROM    
(SELECT P.Name [ProjectName], PC.CategoryId, PC.ProjectId 
     FROM   @Projects P
            INNER JOIN @Project_Categories PC
                ON PC.ProjectId = P.ID
     WHERE  PC.CategoryId = 1
    ) A
    INNER JOIN (SELECT  P.Name [ProjectName], PC.CategoryId, PC.ProjectId
                FROM    @Projects P
                        INNER JOIN @Project_Categories PC
                            ON PC.ProjectId = P.ID
                WHERE   PC.CategoryId = 2
               ) B
        ON A.ProjectId = B.ProjectId
SELECT  A.ProjectName, A.CategoryId, B.CategoryId 
FROM    
(SELECT P.Name [ProjectName], PC.CategoryId, PC.ProjectId 
     FROM   @Projects P
            INNER JOIN @Project_Categories PC
                ON PC.ProjectId = P.ID
     WHERE  PC.CategoryId = 1
    ) A
    INNER JOIN (SELECT  P.Name [ProjectName], PC.CategoryId, PC.ProjectId
                FROM    @Projects P
                        INNER JOIN @Project_Categories PC
                            ON PC.ProjectId = P.ID
                WHERE   PC.CategoryId = 2
               ) B
        ON A.ProjectId = B.ProjectId