找到在多个项目上工作的男性员工

时间:2016-05-23 09:29:31

标签: mysql sql phpmyadmin

我有以下架构:

  

雇员(FNAME,L-NAME,e_no,年龄,地址,性别,slary,dept_number)

     

dpartment(DEPT_NAME,dept_number,dept_location)

     

项目(PNAME,pnumber,plocation,dept_number)

     

works_on(e_no,pnumber,小时)

需要找到在多个项目上工作的男性员工的名字。我创建了以下sql语句。但是它无法正常工作。我的错误是什么以及如何修复它?

SELECT `fname`,`lname` 
FROM `employee`,`works_on`
ON`employee.`e_no`=`works_on`.`e_no` 
WHERE `employee`.`sex`='male' 
GROUP BY `employee`.`e_no` 
HAVING COUNT(works_on.e_no)>1;

3 个答案:

答案 0 :(得分:2)

您应该在pnumber条款中e_no而不是HAVING进行测试:

SELECT fname, lname
FROM employee
JOIN works_on
ON employee.e_no = works_on.e_no
WHERE employee.sex = 'male' 
GROUP BY fname, lname
HAVING COUNT(DISTINCT works_on.pnumber) > 1;

注意:您应该使用显式连接语法而不是旧式隐式语法。

答案 1 :(得分:0)

另一种方法:

select t.fname, t.lname from employee t
where t.sex = 'male' and t.e_no in (select e_no from works_on)

答案 2 :(得分:0)

你可以在加入之前聚合,这应该更有效率(sex上的条件不是很有选择性):

SELECT * 
FROM employee
WHERE sex = 'male' 
AND e_no IN
 (
   SELECT e_no
   FROM works_on
   GROUP BY e_no
   HAVING COUNT(*) > 1
 ) 

如果(e_no,pnumber)的组合不是唯一的:

HAVING COUNT(DISTINCT pnumber) > 1