2017-08-01 88 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;