3

これは、私の DB の関連部分の簡略版です。

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 であるという事実から、必要なスキル A、B、および C を持っているため、ポジション 5 の資格があるが、ポジション 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 に答える