查找属于多个类别的项目
Find projects which belong to several categories
我有一个 projects
table(id
和 name
列),一个 categories
table([=13= 列] 和 name
) 和连接 table projects_categories
(列 project_id
和 category_id
)。
我想编写一个查询,其中 return 属于一组类别的所有项目。例如,如果我有
项目
身份证名称
1 富
2巴
类别
身份证名称
1只蜜蜂
2 哎呀
projects_categories
project_id category_id
1 1
1 2
2 1
如果我传递类别 ID 1 和 2,我想编写一个查询 return 将项目 "foo" 告诉我。我尝试了以下查询,但它 returns 属于类别 1 或 2,而不是类别 1 和 2 的所有项目。
SELECT "projects".*
FROM "projects"
INNER JOIN "projects_categories" ON "projects_categories"."project_id" = "project"."id"
WHERE "projects_categories"."category_id" IN (1, 2)
以下查询没有return任何结果:
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
我理解为什么这些查询 return 这些结果,但不知道如何编写我需要的查询。
你可以试试 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)
)
或JOIN
:
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"
或IN
:
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)
)
问题是查询正在查看相同的 table 和列并试图获得两个不同的值。这样就把两个不同的条件分开,然后合并成一个结果集。
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
我有一个 projects
table(id
和 name
列),一个 categories
table([=13= 列] 和 name
) 和连接 table projects_categories
(列 project_id
和 category_id
)。
我想编写一个查询,其中 return 属于一组类别的所有项目。例如,如果我有
项目 身份证名称 1 富 2巴
类别 身份证名称 1只蜜蜂 2 哎呀
projects_categories project_id category_id 1 1 1 2 2 1
如果我传递类别 ID 1 和 2,我想编写一个查询 return 将项目 "foo" 告诉我。我尝试了以下查询,但它 returns 属于类别 1 或 2,而不是类别 1 和 2 的所有项目。
SELECT "projects".*
FROM "projects"
INNER JOIN "projects_categories" ON "projects_categories"."project_id" = "project"."id"
WHERE "projects_categories"."category_id" IN (1, 2)
以下查询没有return任何结果:
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
我理解为什么这些查询 return 这些结果,但不知道如何编写我需要的查询。
你可以试试 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)
)
或JOIN
:
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"
或IN
:
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)
)
问题是查询正在查看相同的 table 和列并试图获得两个不同的值。这样就把两个不同的条件分开,然后合并成一个结果集。
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