3

这是我的数据库相关部分的简化版本:

Person:
    id

PersonSkills:
    person_id
    skillname
    ability

Position:
    id

PositionSkills:
    position_id
    skillname
    ability

一个人可以有任意数量的 PersonSkills,假设在这个例子中,我们的用户有 6 个。一个职位可以需要任意数量的 PositionSkills,比如说在这个例子中,这个职位需要 3 个。我需要一个查询来确定所有的与此职位关联的 PositionSkills 存在于与此人关联的 PersonSkills 中。(我还需要确保 PersonSkill 的能力大于 PositionSkill 的能力,但我认为一旦我找出了在这里给我带来麻烦的部分,那就很简单了。)

在此先感谢,杰森

编辑

以下是有关我正在寻找的内容的更多详细信息:

PersonSkills
+-------------+---------+---------+
| person_id   | skill   | ability |
+-------------+---------+---------+
|     1       |  A      | 5       |
|     1       |  B      | 4       |
|     1       |  C      | 5       |
|     1       |  D      | 4       |
|     1       |  E      | 5       |
+-------------+---------+---------+

PositionSkills
+-------------+---------+---------+
| position_id | skill   | ability |
+-------------+---------+---------+
|     5       |  A      | 3       |
|     5       |  B      | 3       |
|     5       |  C      | 3       |
|     6       |  A      | 3       |
|     6       |  B      | 3       |
|     6       |  Z      | 3       |
+-------------+---------+---------+

从我是用户 1 的事实来看,我想要一个查询来告诉我我有资格担任职位 5,因为我具有所需的技能 A、B 和 C,但我不符合职位 6 的资格,因为我缺乏技能Z

再次感谢,杰森

4

1 回答 1

3

试试这个解决方案:

SELECT
    a.id,
    (COUNT(c.position_id) = (SELECT COUNT(*) FROM positionskills WHERE position_id = <position_id here>)) AS isQualified
FROM
    person a
LEFT JOIN
    personskills b ON a.id = b.person_id
LEFT JOIN
    positionskills c ON 
        b.skillname = c.skillname AND 
        b.ability >= c.ability AND
        c.position_id = <position_id here>
GROUP BY
    a.id
WHERE
    a.id = <person_id here>

如果这个人是合格的,isQualified将是1否则它将是0

编辑:根据问题中的说明,要获得该人有资格担任的所有职位,请使用以下解决方案:

SELECT
    a.position_id
FROM
    (
        SELECT bb.position_id, COUNT(*) AS skillshave
        FROM personskills aa
        INNER JOIN positionskills bb ON aa.skillname = bb.skillname AND aa.ability >= bb.ability
        WHERE aa.person_id = <person_id here>
        GROUP BY bb.position_id
    ) a
INNER JOIN
    (
        SELECT position_id, COUNT(*) AS skillsrequired
        FROM positionskills
        GROUP BY position_id
    ) b ON a.position_id = b.position_id AND a.skillshave = b.skillsrequired
于 2012-07-05T02:38:40.613 回答