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