我正在尝试选择在每个项目上工作时间最长的员工,但是它只是为每个项目ID选择第一个属性。
作业表:
+-----------+----------------+-------------+
| ProjectID | EmployeeNumber | HoursWorked |
+-----------+----------------+-------------+
| 1000 | 1 | 30.00 |
| 1000 | 8 | 75.00 |
| 1000 | 10 | 55.00 |
| 1100 | 4 | 40.00 |
| 1100 | 6 | 45.00 |
| 1200 | 1 | 25.00 |
| 1200 | 2 | 20.00 |
| 1200 | 4 | 45.00 |
| 1200 | 5 | 40.00 |
| 1300 | 1 | 35.00 |
| 1300 | 8 | 80.00 |
| 1300 | 10 | 50.00 |
| 1400 | 4 | 15.00 |
| 1400 | 5 | 10.00 |
| 1400 | 6 | 27.50 |
+-----------+----------------+-------------+
我的视图表显示了每个项目工作时间最长的员工:
+----------------+-------+-----------+
| EmployeeNumber | MAX | ProjectID |
+----------------+-------+-----------+
| 1 | 75.00 | 1000 |
| 4 | 45.00 | 1100 |
| 4 | 45.00 | 1200 |
| 1 | 80.00 | 1300 |
| 4 | 27.50 | 1400 |
+----------------+-------+-----------+
有关为什么显示员工编号1,4,4,1,4而不是8,6,4,8,6的任何想法?
答案 0 :(得分:1)
不确定是否有任何答案。
Select project_id , max(hoursworked)
FROM Assignment AS A JOIN Employee AS E
ON A.EmployeeNumber = E.EmployeeNumber
GROUP BY A.PROJECTID
此查询告诉您项目的最长工作时间是多少。将其加入到查询中以获取执行此操作的员工ID。
CREATE VIEW MostHours AS
SELECT E.EmployeeNumber, qry.hoursworked, ProjectID
FROM Assignment AS A JOIN Employee AS E
ON A.EmployeeNumber = E.EmployeeNumber
inner join
( Select project_id , max(hoursworked) hoursworked
FROM Assignment AS A JOIN Employee AS E
ON A.EmployeeNumber = E.EmployeeNumber
GROUP BY A.PROJECTID) qry
on a.projectID = qry.projectid and a.hoursworked = qry.hoursworked
我认为这就是语法...对不起我没有一个mysql区域来测试它。逻辑很简单...使用子查询来查找projectID和max hoursworked,将内部联接回到employee / assignment查询。这可以作为一个过滤器,只剩下projectID最多工作时间。这种方法的另一个好处是,当2个人的工作时间相同时,为项目返回两行。
顺便说一下......你所看到的当前行为的原因完全是MYSQL。大多数其他引擎会变平,返回一个错误,说employeeID不是group by语句的一部分而且在那里失败。 MYSQL由于某种原因决定它可以随机带回一个employeeID(或者cluase在组中没有正确指定的任何字段)
编辑:
如果我们不在MYSQL中,那将会奏效。解决方法是两个视图而不是一个...查看我最近评论中的链接:
Create view maxmosthours AS
Select project_id , max(hoursworked) hoursworked
FROM Assignment AS A JOIN Employee AS E
ON A.EmployeeNumber = E.EmployeeNumber
GROUP BY A.PROJECTID
CREATE VIEW MostHours AS
SELECT E.EmployeeNumber, qry.hoursworked, ProjectID
FROM Assignment AS A JOIN Employee AS E
ON A.EmployeeNumber = E.EmployeeNumber
inner join maxmosthours qry
on a.projectID = qry.projectid and a.hoursworked = qry.hoursworked
MYSQL中有一个%^%%的限制