2014-09-29 85 views
0

的表,“雇员”与MySQL的使用GROUP BY

id integer, 
name string, 
office integer, 
income decimal 

我怎么能在一个查询中选择每个办公室3最好的收入(如果可能的话)选择一个以上的结果呢?

SELECT id,name 
FROM employees 
GROUP BY office 
ORDER BY income DESC 

只会返回一个人/办公

+1

考虑提供带有预期结果集的样本数据集 – 2014-09-29 06:26:47

+0

您发布的查询不应起作用。您按列分组,然后选择其他数据。这完全不合逻辑。 – 2014-09-29 06:28:26

回答

1

我会给你一个方法,做这个,但通过一个小的解决方法,你会得到你想要的,检查SQLFiddle为测试的查询。

select * from employees as e1 having 4>=(select count(*) from employees as e2 where e1.income<e2.income); 
1

,让每处可以使用排名查询与用户定义的变量,遗憾的是在其他RDBMS更容易通过窗口达到这种效果的3个收入最高由MySQL的功能没有提供这些功能,下面的查询会给你3名员工,每局最高收入

SELECT t.id,t.name 
FROM (
SELECT *, 
@r:= CASE WHEN @g = office THEN @r + 1 ELSE 1 END row_num, 
@g:= office 
FROM employees 
CROSS JOIN(SELECT @g:=NULL,@r:=0) a 
ORDER BY office,income DESC 
) t 
WHERE t.row_num <=3 
0

选择每个办公室中收入最高:

SELECT office, max(income) 
FROM employees 
GROUP BY office 

这些收入获取员工:

SELECT e.id, e.name, e.office 
FROM employees as e 
INNER JOIN (SELECT office, max(income) as income FROM employees GROUP BY office) as mx ON e.office = mx.office and e.income = mx.income 

编辑:

我复制阿吉什的SQLFiddle测试查询:http://sqlfiddle.com/#!2/de4de1/14/0

+0

只返回一个最佳收入/办公室。 – cyrianox 2014-09-30 09:35:09

+0

难道是你编辑了你原来的问题吗?我可以发誓,一开始没有“3个最佳收入”。 – 2014-10-01 09:00:27