2012-06-27 47 views
0

我有我的表:SQL選擇獨特Entires

ID Name Age 
1 James 15 
2 James 16 
3 Joseph 16 
4 Joseph 18 
5 Steve 4 

,我想回:

5 Steve 4 
1 James 15 
3 Joseph 16 

即。基於名稱行的唯一條目(當存在多個相同名稱時選擇ID最小的那個),並按年齡排序

什麼是正確的SQL語句?

我:

Select * FROM table Where True GROUP BY Name ORDER BY Age 

這似乎是回到了很多獨特的結果,但它的速度太慢(表具有> 250,000個條目,它需要>30秒處理),如果有一個我不知道更快的方式來做到這一點?

+0

其實......我的查詢結果實際上是不正確的。結果是沒有「GROUP BY Name」部分的查詢中缺少很多行(無論是否唯一)...不知道爲什麼...... –

+0

順便說一句,您期望得到'1 John 5'的結果, '2約翰5'? :) –

+0

哦,沒關係,我誤解了你的追求。 –

回答

0

試試這個

SELECT *
FROM表 凡(SELECT MIN(ID)FROM表組的名字)
ORDER BY年齡

你剛纔組數據集ID通過名稱並獲得MIN(ID)並將其用作「where」條件以供選擇

0

另一種查詢方式荷蘭國際集團此,通常最好在需要性能,只要你有(在這裏,這不是一個選項)的指數Name

SELECT * 
FROM your_table t1 
LEFT JOIN your_table t2 ON t1.Name = t2.Name AND t2.ID < t1.ID 
WHERE t2.ID IS NULL; 

快速explanation here

0

由於您要根據最小的ID(這是一個唯一的字段)進行選擇,因此您只需首先獲取每個名稱的最小值ID,然後將這些ID s連接到主表。這將比在WHERE中使用子查詢要快得多,因爲最小值的子查詢只執行一次,而子查詢將爲主表中的每一行執行(250,000+次!)。

SELECT 
    b.* 
FROM 
    (
     SELECT MIN(ID) AS minID 
     FROM tbl 
     GROUP BY Name 
    ) a 
INNER JOIN 
    tbl b ON a.minID = b.ID 
ORDER BY 
    b.Age