【问题标题】:MySQL: Select records where joined table matches ALL valuesMySQL:选择连接表匹配所有值的记录
【发布时间】:2014-02-07 04:39:15
【问题描述】:

我正在努力寻找所有具备多种技能的员工。以下是表格:

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)的员工。

有什么想法吗?谢谢

【问题讨论】:

  • sqlfiddle.com 在这种情况下让生活变得轻松
  • 这是你想要的吗? SELECT DISTINCT(em.ID), em.Name ,skill.Name FROM employee em INNER JOIN emp_Skills es ON es.emp_ID = em.ID LEFT JOIN Skill ON Skill.id= es.skill_id WHERE es.skill_ID IN ('1' , '2')

标签: mysql sql join


【解决方案1】:

这样就可以了:

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:

不同的是,如果同一员工具有两次列出的技能。

感谢提供测试数据。

【讨论】:

  • 谢谢斯图尔特,成功了。我以前从未使用过嵌套查询。
  • 我喜欢堆栈建议的帖子功能...我有完全相同的问题,这成功了!谢谢!
【解决方案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 子句中的每个条件都会计算每个员工具有特定技能的行数。过滤器保证两种技能都存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2015-09-09
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多