我有一个 SQL 数据库,其中有一个名为staff
,具有以下列:
workerID (Prim.key), name, department, salary
我应该找到每个部门工资最高的工人,并使用以下语句:
select staff.workerID, staff.name, staff.department, max(staff.salary) AS biggest
from staff
group by staff.department
我从每个部门显示一名工人,但他们不是工资最高的工人,而是显示最大的工资值,即使工人没有得到该工资。
显示的人员是每个部门具有“最低”workerID 的工人。
因此,即使在 group by 语句中没有提及,也会使用主键进行一些排序。
有人可以解释一下发生了什么以及如何正确排序。
对发生的事情的解释:
你正在执行一个GROUP BY
on staff.department
,但是你的SELECT
列表包含 2 个非分组列staff.workerID, staff.name
。在标准 sql 中,这是一个语法错误,但是 MySql 允许这样做,因此查询编写者必须确保他们自己处理这种情况。
参考:http://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html
在标准 SQL 中,包含 GROUP BY 子句的查询无法引用选择列表中未在 GROUP BY 子句中命名的非聚合列。
MySQL 扩展了 GROUP BY 的使用,以便选择列表可以引用未在 GROUP BY 子句中命名的非聚合列。
服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则所选择的值是不确定的。
从 MySQL 5.1 开始,可以通过在 sql_mode 中设置 ONLY_FULL_GROUP_BY 标志来禁用非标准功能:http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sqlmode_only_full_group_by
怎么修:
select staff.workerID, staff.name, staff.department, staff.salary
from staff
join (
select staff.department, max(staff.salary) AS biggest
from staff
group by staff.department
) t
on t.department = staff.department and t.biggest = staff.salary
在内部查询中,使用 GROUP BY 获取部门及其最高工资。然后在外部查询中将这些结果与主表连接起来,这将为您提供所需的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)