2014-12-05 44 views
3

比方說,我有一個下表:計算組功能(計數,最小值,最大值...)的列值不進行分組

表用戶(ID,姓名,年齡,市)

1 John 26 New York 
2 Aaron 31 Dallas 
3 Jenifer 35 Dallas 
4 Connely 34 New York 

而且我想與所有用戶一個表,他(她)一個城市的最低年齡:

1 John 26 New York 26 
2 Aaron 31 Dallas 31 
3 Jenifer 35 Dallas 31 
4 Connely 34 New York 26 

這個例子是有點做作,但是我也沒弄明白什麼更好的的例子。

如果我使用像要求:

SELECT * FROM用戶MIN(年齡)GROUP BY城市

我可能會得到:

1 John 26 New York 
2 Aaron 31 Dallas 

我不知道它將返回第1行和第2行,但這不是重點:我需要在結果中有所有用戶。

可能嗎?

+2

你的問題寫得很複雜。你真正想要的是什麼?你說:1.我想每個城市的最年輕的用戶//但你也說:2.我想所有的用戶//這看起來像兩個不同的查詢對我來說 – Xavjer 2014-12-05 14:58:14

回答

11

我會傾向於用join做到這一點:

select u.*, c.minage 
from users u join 
    (select city, min(age) as minage 
     from users 
     group by city 
    ) c 
    on u.city = c.city; 
+0

是的,這是好事。儘管如此,我會使用LEFT JOIN或LEFT OUTER JOIN來明確「JOIN」。 – Calvintwr 2014-12-06 06:13:53

+2

@Calvintwr。 。 。 「左連接」是不必要的,因爲聚集中的所有城市都在表格中(如果「城市」是「NULL」,「左連接」不會完全符合你的要求)。如果你想明確,那麼你可以寫'內部連接'。 – 2014-12-06 13:25:21

1

而且我會做一個子選擇:

select u.*, (select MIN(age) from users s where s.city = u.city) 
from users u; 
相關問題