比较MySQL中的两个集合是否相等

时间:2013-07-08 10:31:46

标签: mysql sql

我需要比较两组是否相等。

我的员工表格为

emp_id  | Name    
-----------------
1         Thomas 
2         John
3         Jeff     
.....
.....

Employee_Language

Emp_id | Language   
------------------
1        English
1        French
2        Thai         
3        English
3        French
3        Chinese 
...
...

所以我需要找到所有知道给定语言列表的员工 例如'英语,法语'

我知道,使用

select * from employee_language lng 
 where find_in_set(lng.language,'English,French') 

将列出一个既懂英语又懂法语的员工名单。我怎样才能找到兼顾两者的员工?

3 个答案:

答案 0 :(得分:4)

WHERE language IN('x','y') GROUP BY emp_id HAVING COUNT (*) = 2 

(其中'2'是IN子句中的项目数)

所以你的整个查询可能是:

SELECT e.emp_Id
     , e.Name
  FROM Employee e
  JOIN Employee_Language l
    ON e.emp_id = l.emp_id
 WHERE l.Language IN('English', 'French')
 GROUP  
    BY e.emp_id 
HAVING COUNT(*) = 2

请参阅this SQLFiddle

答案 1 :(得分:3)

我只是通过删除'HAVING'子句中的常量(2)并参数化标准来改进接受的答案..希望这有助于某人

set @lst = 'English,French,Chinese' ;

SELECT e.emp_Id,Name
 FROM Employee e
 JOIN Employee_Language l
 ON e.emp_id = l.emp_id
 WHERE FIND_IN_SET(l.Language,@lst)
 GROUP BY e.emp_id 
 HAVING COUNT(*) = (SELECT LENGTH(@lst) - LENGTH(REPLACE(@lst, ',', '')) AS `occurrences`)+1 ;

SQL Fiddle

答案 2 :(得分:2)

完整的查询:

select EMP.Name
from Employee EMP
where EMP.emp_id in 
(
   select EMP_L.emp_id
   FROM Employee_Language EMP_L
   EMP_L.emp_id
   WHERE Language in ('English','French')
   GROUP BY EMP_L.emp_id
   HAVING COUNT(*)=2
)