2014-02-07 88 views
3

我试图找到具有多种技能的所有员工。下面是表:MySQL:选择加入的表匹配的记录所有值

CREATE TABLE IF NOT EXISTS `Employee` (
    `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `Name` varchar(100) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 
INSERT INTO `Employee` (`ID`, `Name`, `Region_ID`) VALUES (1, 'Fred Flintstone'), (2, 'Barney Rubble'); 

CREATE TABLE IF NOT EXISTS `Skill` (
    `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `Name` varchar(100) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 
INSERT INTO `Skill` (`ID`, `Name`) VALUES (1, 'PHP'), (2, 'JQuery'); 

CREATE TABLE IF NOT EXISTS `Emp_Skills` (
    `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `Emp_ID` bigint(20) unsigned NOT NULL DEFAULT '0', 
    `Skill_ID` bigint(20) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; 
INSERT INTO `Emp_Skills` (`ID`, `Emp_ID`, `Skill_ID`) VALUES (1, 1, 1), (2, 1, 2), (3, 2, 1); 

下面是该查询我到目前为止:

SELECT DISTINCT(em.ID), em.Name 
FROM Employee em 
INNER JOIN Emp_Skills es ON es.Emp_ID = em.ID 
WHERE es.Skill_ID IN ('1', '2') 

这两者都返回的员工,但是,我需要找到一个既有能力(ID 1和2员工)。

任何想法?由于

+0

http://sqlfiddle.com/在这种情况下让生活变得简单 –

+0

这是你想要的吗? SELECT DISTINCT(em.ID),em.Name,skill.Name FROM雇员EM INNER JOIN emp_Skills ES ON es.emp_ID = em.ID LEFT JOIN技能ON skill.id = es.skill_id WHERE es.skill_ID IN('1','2') – user12

回答

3

这将做到这一点:

SELECT EmpId, Name 
FROM 
(
    SELECT em.ID as EmpId, em.Name, es.ID as SkillID 
    FROM Employee em 
    INNER JOIN Emp_Skills es ON es.Emp_ID = em.ID 
    WHERE es.Skill_ID IN ('1', '2') 
) X 
GROUP BY EmpID, Name 
HAVING COUNT(DISTINCT SkillID) = 2; 

Fiddle here:

的不同是公正的情况下相同的员工都有两次列出的技能。

感谢您的测试数据。

+0

谢谢斯图尔特,那就是诀窍。我以前从未使用过嵌套查询。 – dalatron

+1

我爱堆栈的建议帖子功能...我有完全相同的问题,这就是诀窍!谢谢! –

2

您可以聚集和having条款做到这一点:

SELECT em.ID, em.Name 
FROM Employee em INNER JOIN 
    Emp_Skills es 
    ON es.Emp_ID = em.ID 
GROUP BY em.id, em.name 
HAVING sum(es.Skill_id = '1') > 0 and 
     sum(es.Skill_id = '2') > 0; 

having子句中每个条件计算为行具有特定技能每个员工的数量。过滤器保证两种技能都存在。

相关问题