如何根据一个特定列的唯一性从表中获取* DISTINCT行?

时间:2011-12-04 21:57:22

标签: mysql

在此表中,3条记录共享相同的状态值:

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    |

3 个答案:

答案 0 :(得分:1)

尝试Group By。在这种情况下:

SELECT DISTINCT * FROM myTable GROUP BY state

答案 1 :(得分:0)

在上面的例子中,你不能过滤State,因为Bob和Jake2也住在纽约;你需要一些更多的属性来定义Jake和Lisa是唯一的。

要获得每个州的不同值列表,您可以简单地:

SELECT DISTINCT * FROM myTable WHERE State = 'NY'

然而,正如你所看到的,这将带回3个人,而且他们都不是丽莎。

答案 2 :(得分:0)

我认为FGraviton很接近,但我会写这样的查询:

SELECT * 
FROM myTable
GROUP BY state

您想要的结果不需要DISTINCT。另一方面,我可能更喜欢这个:

SELECT DISTINCT state 
FROM myTable 
ORDER BY state;

同样,我们需要更好地了解您要做的事情,以便我们能够真正地谈论如何正确设计数据和查询。

现在,请记住,破折号的答案将返回碰巧将“NY”作为其状态的行的所有唯一变体。换句话说,可以想象(实际上,理想情况下,假设设计和数据完整性很好),在这个例子中你不会用DISTINCT *来清除单行,因为每一行(应该/可能?)都有某种类型的变化,可能在名称栏中。同样,DISTINCT *和WHERE state ='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;