在我的一生中,我无法找到一个查询,该查询将获取Skill_ID的列表,并返回包含搜索到的所有技能的人/人的建筑物列表
我现在有这些桌子
Building
===========
ID | name
===========
1 | BlockA
2 | BlockB
People
============================
ID | name | Building_ID
============================
1 | PersonA | 1
2 | PersonB | 2
Skills
===========
ID | name
===========
1 | SkillA
2 | SkillB
SkillsToPerson
====================
Person_ID | Skill_ID
====================
1 | 1
1 | 2
2 | 2例如,我想找到至少有一个SkillA和SkillB的建筑,BlockA应该返回,因为Person1有两种技能,并且在BlockA。
有人能给我一些建议吗?谢谢
发布于 2016-04-21 11:12:39
您可以使用GROUP BY和HAVING来完成这一任务。
SELECT b.Name AS Building
FROM Building b JOIN
People p
ON b.ID = p.Building_ID JOIN
SkillsToPerson sp
ON p.ID = sp.Person_ID
WHERE sp.skill_id IN (1, 2, 3) -- Skill IDs to look for
GROUP BY b.Name
HAVING COUNT(DISTINCT sp.skill_id) = 3; -- 3 skills请注意,您不需要Skills表,因为您具有SkillsToPerson中的技能id。类似地,如果您对建筑id感到满意,则不需要building表。
我将这种类型的查询称为“集内集”查询,因为您正在寻找另一个(建筑物)中的某物(技能)集。GROUP BY和HAVING为处理这类查询提供了一种非常灵活的方法。
发布于 2016-04-21 11:08:37
不如:
SELECT DISTINCT Building.Name
FROM People
INNER JOIN Building
ON Building.ID = People.Building_ID
INNER JOIN SkillsToPerson
ON SkillsToPerson.Person_ID = People.ID
INNER JOIN Skills
ON Skills.ID = SkillsToPerson.Skills_ID
WHERE Skills.Skill_ID IN (1, 2, 3, ...) -- list of skills here发布于 2016-04-21 11:10:53
那这个呢?
SELECT *
FROM people p
LEFT JOIN building b ON p.building_id = b.id
LEFT JOIN skillstoperson s ON p.id = s.person_id
LEFT JOIN skill sn ON s.skill_id = sn.id
WHERE s.skill_id = @myskill;https://stackoverflow.com/questions/36767640
复制相似问题