Mysql 检索具有多个关联项的行

Mysql 检索具有多个关联项的行,mysql,sql,Mysql,Sql,假设我有一个ASOC类型表,其中包含以下条目: +----------+----------+ | PERSON | SKILL | +----------+----------+ | Bob | Java | | Bob | Database | | Sarah | Java | | Sarah | HTML | | Jane | Java | | Jane | HTML | | Jane

假设我有一个ASOC类型表,其中包含以下条目:

+----------+----------+
| PERSON   | SKILL    |
+----------+----------+
| Bob      | Java     |
| Bob      | Database |
| Sarah    | Java     |
| Sarah    | HTML     |
| Jane     | Java     |
| Jane     | HTML     |
| Jane     | Database |
+----------+----------+
我想要一个查询,返回同时具备Java和数据库技能的人员列表,即Bob和Jane

如果我运行如下查询:

SELECT PERSON
FROM   PERSON_SKILLS_ASOC
WHERE  SKILL = 'Java'
OR     SKILL = 'Database'
我也会找到莎拉,她不符合我要填补的职位。我是否需要执行某种并集/交集查询


我在MySQL上。提前感谢。

我已经多年没有在MySQL中工作了,所以我的语法可能会有点不正确,但要点是
存在

SELECT
    PSA1.Person
FROM
    PERSON_SKILLS_ASOC AS PSA1
WHERE
        PSA1.Skill = 'Java'
    AND EXISTS (SELECT * FROM PERSON_SKILLS_ASOC AS PSA2 WHERE PSA1.Person = PSA2.Person AND PSA2.Skill = 'Database')
您也可以通过连接来实现这一点

select a.person
from (select person from person_skills_asoc where skill = 'Java') a
     (select person from person_skills_asoc where skill = 'Database') b
where a.person = b.person;


例如,在SQL Server中,您可以使用
INTERSECT
,这在MySQL中显然是不可用的。使用自联接的可能解决方案(请检查):


对于MySQL中的
INTERSECT
,这里还有另一个很好的答案:。

使用如下连接:-

SELECT a.PERSON
FROM   PERSON_SKILLS_ASOC a
INNER JOIN PERSON_SKILLS_ASOC b ON a.PERSON = b.PERSON
WHERE  a.SKILL = 'Java'
AND    b.SKILL = 'Database'
或使用计数:-

SELECT PERSON
FROM   PERSON_SKILLS_ASOC a
WHERE  SKILL IN ('Java', 'Database')
GROUP BY PERSON
HAVING  COUNT(DISTINCT SKILL) = 2

更改为
,因为您需要一个同时具备两种技能而不是一种或另一种技能的人。WHERE skill in('java','database')按COUNT(*)=2的人分组,其中'2'是in()参数中的项数
SELECT a.PERSON
FROM   PERSON_SKILLS_ASOC a
INNER JOIN PERSON_SKILLS_ASOC b ON a.PERSON = b.PERSON
WHERE  a.SKILL = 'Java'
AND    b.SKILL = 'Database'
SELECT PERSON
FROM   PERSON_SKILLS_ASOC a
WHERE  SKILL IN ('Java', 'Database')
GROUP BY PERSON
HAVING  COUNT(DISTINCT SKILL) = 2