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转换为视图并引用它。我将编辑答案