感觉网上很多表述都有些问题,网上很多讲述“列去重”的意思都说把当前的列重复的数据去重,但是还有一种情况是关联表查询后出现大量重复同名列的情况,假如对这种列的结果进行嵌套查询,就有可能报Duplicate column name 'XXX'的错误,或者指代不明Column 'XXX' in field list is ambiguous的错误。

假如有这样两张表(仅供参考,不代表有实际数据库设计)

ta

stu_id

stu_name

org_id

class_id

sub_id

score

1001

张三

123

11

401

88

1002

李四

123

12

401

78

1003

王五

123

11

401

97

1004

陆六

321

11

401

65

1001

张三

123

11

402

87

1002

李四

123

12

402

93

1003

王五

123

11

402

99

1004

陆六

321

11

403

89

tb

tea_id

tea_name

org_id

class_id

sub_id

2001

乔治

123

11

401

2001

乔治

123

12

401

2002

佩奇

123

12

402

2002

佩奇

321

11

401

2003

吉吉

123

12

401

2003

吉吉

321

11

403

一.去重同一列的重复数据

1.distinct

需求:找出tb中org_id的种类

分析:单表查询并去重相同的org_id值

select distinct(org_id) from tb

查询结果:

org_id

123

321

2.group by

需求:查询学生总分

分析:单表查询,分组统计成绩

select stu_id,stu_name,sum(score) from ta group by stu_id,stu_name

查询结果

stu_id

stu_name

sum

1001

张三

175

1002

李四

171

1003

王五

196

1004

陆六

154

错误示例:不分组会出现数据重复显示

select stu_id,stu_name,sum(score) from ta

stu_id

stu_name

sum

1001

张三

175

1002

李四

171

1003

王五

196

1004

陆六

154

1001

张三

175

1002

李四

171

1003

王五

196

1004

陆六

154

3.其他常用的方法还有row_number over(),LIMIT 等,本人用得比较少,可以自行了解。

二.重复的同名列

一般出现在合并表查询中

需求:找出乔治教的学生和老师所有信息

分析:找出乔治任教班级和科目,关联学生表

select * from ta inner join tb on ta.class_id =tb.class_id where tea_name = '乔治'

查询结果:

mysql去掉重复列 mysql消除重复列_数据库

可以看到查询的结果是有重复的同名列,当然在查询的时候,会把后面的同名列自动重命名

分析:那么我们如果想把进行关联的同名列合并显示,可以改用USING()来代替ON,来去重

select * from ta inner join tb using(class_id) where tea_name = '乔治'

查询结果:

stu_id

stu_name

org_id

class_id

sub_id

score

tea_id

tea_name

org_id(1)

1001

张三

123

11

401

88

2001

乔治

123

1002

李四

123

12

401

78

2001

乔治

123

1003

王五

123

11

401

97

2001

乔治

123

可以看到没有关联的org_id还是会自动重命名。

问题来了,如果要进行嵌套查询,比如(实际意义的例子暂时没想到,容我这样举例。。)

select class_id from (select * from ta inner join tb using(class_id) where tea_name = '乔治') tc

就会出现 Duplicate column name 'org_id'这种错误

原因是sql在合并表重命名第二个同名列实际上还是存成org_id,只是呈现出来不一样。所以方法有几个:

1.对第二个org_id进行人为重命名

2.把org_id纳入到using()中,保证查询结果只有一个org_id

3.select出想要的字段,避免重名列干扰