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

到目前为止你们做得很好,我只会按照纬度,经度 –

相关问题