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