sql:对某一字段去重,并展示其他字段信息
为了举例专门建了一张表(usertest) 数据如下;
id | name | age |
---|---|---|
1 | LBJ | 35 |
2 | DWS | 28 |
3 | LBJ | 26 |
4 | KLS | 29 |
5 | KZM | 28 |
6 | KZM | 30 |
7 | LBJ | 33 |
现在以name字段去重,并同时展示其他字段的信息(name相同的记录随便展示那条都可以)。
这里容易犯错的语句如下:
错误示例:
select * from usertest where name in (select DISTINCT name from usertest )
这里利用distinct ,查询的结果是所有的。并不是去重的。
可以达到目的的sql 如下:
select * from usertest where id in
(select max(id) as id from usertest group by name);
详细分析:
这里使用的子查询、聚合函数、以及分组函数。
- 比如我以name来去重, 那么就以name来分组,这时候得到的结果有如下:
- 第一组:
id | name | age |
---|---|---|
1 | LBJ | 35 |
3 | LBJ | 26 |
7 | LBJ | 33 |
- 第二组:
id | name | age |
---|---|---|
2 | DWS | 28 |
- 第三组:
id | name | age |
---|---|---|
4 | KLS | 29 |
- 第四组:
id | name | age |
---|---|---|
5 | KZM | 28 |
6 | KZM | 30 |
- 使用聚合函数max(id) ,分组中id最大的 (min也可以,目的就是取分组中的其中一条) ,然后得到结果如下:
-
第一组:
id = 7 -
第二组:
id= 2 -
第三组:
id= 4 -
第四组:
id = 6
- 通过上述的子查询,得到了id 的集合 分别为(7,2,4,6)
最后通过外部查询 select * from usertest where id in (7,2,4,6) , 即查出了去重字段以及其他字段的信息,满足需求。
当然解法这只是其中一种写法,有兴趣尝试其他实现。