MySQL:选择连接表匹配所有值的记录

标签 mysql sql join

我试图找到所有具有多种技能的员工。以下是表格:

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

有什么想法吗?谢谢

最佳答案

这样做就可以了:

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:

不同是为了防止同一员工具有两次列出的技能。

感谢提供测试数据。

关于MySQL:选择连接表匹配所有值的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21619480/

相关文章:

mysql - SQL 查询多次返回 group_concat 函数中的标签字段

sql - 在单行不同列中显示Oracle树结构层次结构数据

php - mysql对左表中的空值进行联接查询

sql - Teradata更新联接语法

postgresql - 如何通过加入的 hstore 键在一个组上计数不同?

mysql - 表被指定两次,既作为 INSERT 的目标又作为单独的数据源

mysql - 如何在MySQL自然全外连接中使用别名?

sql - 生成范围之间的数字

mysql - 在 cakephp 中发送邮件时出错

java - 使用 Java 连接到 MySql - SSL 连接