Mysql 选择工作时间最多的员工编号
我试图选择在每个项目上工作时间最多的员工,但这只是为每个项目选择第一个属性 分配表:Mysql 选择工作时间最多的员工编号,mysql,sql,Mysql,Sql,我试图选择在每个项目上工作时间最多的员工,但这只是为每个项目选择第一个属性 分配表: +-----------+----------------+-------------+ | ProjectID | EmployeeNumber | HoursWorked | +-----------+----------------+-------------+ | 1000 | 1 | 30.00 | | 1000 |
+-----------+----------------+-------------+
| 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,你有什么想法吗?不确定这两个答案是否都有
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查询。这是一个过滤器,只剩下Projectd的最大工作小时数。这种方法还有一个额外的好处,即当两个人平均工作最多小时时,一个项目返回两行
顺便说一句,你看到的当前行为的原因完全是MYSQL。大多数其他引擎都会直接返回一个错误,指出employeeID不是GROUPBY语句的一部分,并立即失败。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中的一个限制%^%@$%,添加组中的employeenumber by,您错过了。您创建的视图返回此错误:错误1349(HY000):视图的SELECT在FROM子句中包含一个子查询…我忘了MYSQL有此错误。这里列出的解决方案是将我在子选择中创建的qry转换为视图并引用它。我将编辑答案