在此表中,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 |
答案 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;