在MYSQL中使用SELECT DISTINCT

8

我一直在搜索,但并没有找到关于我的MYSQL问题的答案。

SELECT DISTINCT name, type, state, country FROM table

共找到1795条记录

SELECT DISTINCT name FROM table

共有1,504条记录的结果

对于每个重复的“名称”……每个记录中的“类型”,“状态”和“国家”都不匹配。

尝试找出如何选择与DISTINCT名称相关联的行,而无需检查它们是否是DISTINCT的。


这与PHP无关,所以我删除了该标签。 - jigfox
2
很抱歉,我有些难以理解你的问题。你能否发布一个简化版本的数据,并解释一下你想要什么? - Chowlett
类似的内容:https://dev59.com/MXVD5IYBdhLWcg3wNIvc - jigfox
您可能想添加输出示例。例如:这里有3行重复的名称,但类型、状态和国家不同。[这里有3行:-)] 我想要[期望的输出行] - potatopeelings
2个回答

18
SELECT name, type, state, country FROM table GROUP BY name;

应该就可以解决问题了。


3
对于已经分组的列,您不需要使用DISTINCT。在定义了“按名称分组”之后,会将所有具有相同“名称”的内容汇总起来。因此,在结果中,每个“名称”都是唯一的。 - jigfox
3
你有检查那个查询吗?在我看来,任何不在group by子句中的列都需要进行某种形式的聚合。 - Janick Bernet
1
请注意:根据这篇文章http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html,在使用此功能时,每个组中的所有行应该对于在GROUP BY部分被省略的列具有相同的值。 当您按“名称”分组并且单个“名称”值有多个“类型”/“状态”/“国家”时,MySQL将为结果集中的每个“名称”采用不确定的“类型”/“状态”/“国家”值。 - Aliaksei Kliuchnikau
2
@FrantišekŽiačik 它返回的结果取决于排序方式。例如:GROUP BY name ORDER BY state DESC 将返回每个唯一名称及其对应的最高状态。尽管 MySQL 违反了 SQL 标准,但我有时发现这种行为非常有用。 - Fabrício Matté
1
警告其他遇到这个问题的人:非常注意关注有关非分组列聚合的讨论!尽管此答案中的代码在技术上是正确的,但它是危险和误导性的。 - Dan Nissenbaum
显示剩余8条评论

2
如果您想要不同的名称,您必须决定您想要哪个不同名称可能出现的多个值。例如,您可能想要最小值或计数:
SELECT name, min(type), min(state), count(country) FROM table GROUP BY name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接