我需要比较两组是否相等。
我的员工表格为
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')
将列出一个既懂英语又懂法语的员工名单。我怎样才能找到兼顾两者的员工?
答案 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
答案 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 ;
答案 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
)