2017-08-01 80 views
0

我想做的这个question获取记录的一组

我需要的最小值出分组记录的反面,这样的最小值,从链接的问题采取相同的信息,从

ID | Person | Group | Age 
--- 
1 | Bob | 1  | 32 
2 | Jill | 1  | 34 
3 | Shawn | 1  | 42 
4 | Jake | 2  | 29 
5 | Tom | 2  | 28 
6 | Paul | 2  | 36 
7 | Laura | 2  | 39 
8 | Julie | 2  | 28 

希望的结果集:

1 | Bob | 1  | 32  
5 | Tom | 2  | 28 

我试图通过用相反的条件上自己加入表(<代替>),但它不是瓦特工作会有。

不允许重复,如果两个人的年龄相同,则必须返回最低ID。

+0

请注意,该组是一个保留字,对列标识符来说,它是一个绝对差的选择。 (并且 - 除非它是死者的桌子 - 你不会真的存储年龄,你是不是!) – Strawberry

+1

嗯,我刚刚复制了链接问题中提供的示例。我知道这是一个保留字。 – Cusy

+0

4,4是故意的吗? – Strawberry

回答

4

我会做到这一点使用where和相关子查询:

select p.* 
from persons p 
where p.age = (select min(p2.age) from persons p2 where p2.group = p.group); 

或:

select p.* 
from persons p 
where p.age = (select p2.age 
       from persons p2 
       where p2.group = p.group 
       order by p2.age desc 
       limit 1 
      ); 

这很容易通过使用id延伸到多个键:

select p.* 
from persons p 
where p.id = (select p2.id 
       from persons p2 
       where p2.group = p.group 
       order by p2.age desc, id asc 
       limit 1 
      ); 
+0

这和加入桌子本身有什么主要区别?不同的表现? – Cusy

+0

@Cusy对于这样的事情,这和自我加入没有太大的区别。性能应该是相同的,因为优化器将以更高效的方式接管并重写。对于像这样的简短子查询,可以归结为是保持原样还是转换为自连接。 – yanman1234

+0

@Cusy。 。 。我发现这更容易遵循。在MySQL和其他数据库中,我认为两者的表现应该是相似的,特别是对于“人员(组,年龄)”的索引。 –

0

这里有一个(为了保持我的理智,我重新命名了其中一列):

SELECT a.* 
     FROM my_table a 
     JOIN 
     (SELECT MIN(id) id 
      FROM my_table x 
      JOIN 
       (SELECT group_id, MIN(age) age FROM my_table GROUP BY group_id) y 
       ON y.group_id = x.group_id 
       AND y.age = x.age 
      GROUP 
       BY x.group_id 
       , x.age 
     ) b 
     ON b.id = a.id;