2011-12-04 54 views
2

在該表3中記錄共享相同的狀態值:如何根據某個特定列的唯一性從表中獲取* DISTINCT行?

name | state | country 
--------------------- 
Jake | NY | US 
Lisa | PH | US 
Bob | NY | US 
Jake2 | NY | US 

如果我使用:

SELECT DISTINCT * FROM myTable 

其結果將是:

Jake | NY | US 
Lisa | PH | US 
Bob | NY | US 
Jake2 | NY | US 

我需要:

Jake | NY | US 
Lisa | PH | US 

如何根據某個特定列(狀態)的值從表中獲取所有不同的行?

我需要

Jake | NY | US 
Lisa | PH | 
Bob | NY | 
Jake2 | NY | 
+0

因此,您只需要返回每個狀態的一條記錄?你想如何決定哪一個? – Taymon

+1

表是否有主鍵? –

+1

好的問的問題。你確定你想要*欄嗎?你爲什麼不選擇「國家」? –

回答

1

試試Group By。在這種情況下:

SELECT DISTINCT * FROM myTable GROUP BY state 
+0

爲什麼-1?你有什麼更好的主意嗎?!狗屎啊讓我猜測,「羣」由stmnt ... – amrfaissal

0

在上面的例子中,你不能在國家篩選,鮑勃和Jake2也住在紐約;你需要更多的屬性來將Jake和Lisa定義爲唯一的。

,讓每州不同值的列表,你可以簡單地說:

SELECT DISTINCT * FROM myTable WHERE State = 'NY' 

然而,正如你所看到的,這將帶回3人,其中沒有一個是麗莎。

+0

剛剛發現這篇文章:http://oscarvalles.wordpress.com/2008/01/28/sql-distinct-on-one-column-only/,並試圖這樣:SELECT * FROM myTable GROUP BY狀態ORDER BY狀態。這將返回與myTable中的SELECT DISTINCT *相同的行數。我桌上的是216,260。所以很顯然,我不能手動驗證這是否正確,但通過返回的行數來判斷。只是想由知識淵博的人來運行它,看看這個新的查詢是否工作正常。 – TK123

+0

是的。你找到的答案是正確的。這不是我將使用GROUP BY的經典之處,但它會給你你所需要的。我不明白的是爲什麼你不只是使用myTable ORDER BY狀態的SELECT DISTINCT狀態; –

+0

但是,即使按州分組也不會只返回Jake和Lisa - 因爲Bob和Jake2也屬於State ='NY'。我同意GROUP BY在功能上等同於此例。 – dash

0

我覺得FGraviton接近,但我會寫這樣的查詢:

SELECT * 
FROM myTable 
GROUP BY state 

的DISTINCT並不需要你想要的結果。在另一方面,我可能更喜歡這樣的:

SELECT DISTINCT state 
FROM myTable 
ORDER BY state; 

再次,我們需要更好地瞭解你正在嘗試做的,所以我們可以真正談論如何正確設計數據和查詢火雞。

現在,請記住,破折號的答案會返回碰巧具有'NY'作爲其狀態的行的所有獨特變體。換句話說,可以想象(實際上,理想情況下,假設設計和數據完整性很好),在本例中,不會用DISTINCT *去除單行,因爲每行都會(應該/可能)具有某種類型的變體,可能在名稱列中。同樣,DISTINCT *和WHERE狀態='NY'條款不會相互交談。 DISTINCT只會對查詢的結果做出不同的處理。 DISTINCT無法知道你只想要不同的狀態。

MySQL文檔說DISTINCT c1,c2,c3等同於GROUP BY c1,c2,c3。

我敢肯定,如果我們能夠以某種方式弄清楚你想要做什麼,我們可以幫助你。

感謝您提供的其他信息。在此基礎上的附加信息,這裏就是我會做:

SELECT * 
FROM geo_locations 
WHERE city = 'CITYNAMEHERE' 
GROUP BY city, latitude, longitude 
ORDER BY city ASC; 

當然,這假定每個城市都有一個唯一的真/緯度中。如果有疑問,你可能需要在你的GROUP BY子句中圍繞你的緯度/經度,就像這樣。

SELECT *, round 
FROM geo_locations 
WHERE city = 'CITYNAMEHERE' 
GROUP BY city, round(latitude, 2), round(longitude, 2) 
ORDER BY city ASC; 
+0

好吧,所以基本上我正在使用maxmind地理數據庫。在位置表中有很多重複的記錄。唯一的區別是自動遞增的主鍵。我需要展示屬於特定國家的所有城市。但只要從該表中選擇使用where子句中的國家代碼就會給我所有重複項。你是正確的,只有獨特的旗幟纔會給我帶來這個名字所發現的第一座城市。一些國家有多個不同的城市,名稱相同。所以我上面選擇的答案沒有做到。續... – TK123

+0

而現在我正在使用「SELECT * FROM geo_locations WHERE CITY ='CITYNAMEHERE'GROUP BY緯度ORDER BY城市ASC。< - 即使兩個城市共用相同的名稱,因爲它們的緯度不同,同時防止出現完全重複的行,我知道這並不完全證明,因爲很少有機會讓兩個同名的城市擁有相同的緯度但不同的經度,但這很少見,除非我我錯過了一些應該做的事情 – TK123

+0

到目前爲止你們做得很好,我只會按照緯度,經度 –

相關問題