MySQL多字段去重

您所在的位置:网站首页 district去重多个字段 MySQL多字段去重

MySQL多字段去重

2023-09-07 12:54| 来源: 网络整理| 查看: 265

# 创建学生成绩表grade: # grade表的字段说明:id表示学生编号,name表示学生姓名,gender表示学生性别,score表示学生分数。 create table grade( id int, name char(1), gender char(1), score int )engine myisam charset utf8; # 向学生表中插入数据: insert into grade values (1,'A','f',83), (2,'B','f',79), (3,'C','m',76), (4,'D','m',80), (5,'B','m',92), (6,'A','f',85), (7,'C','m',76); # grade表中的所有信息: +------+------+--------+-------+ | id | name | gender | score | +------+------+--------+-------+ | 1 | A | f | 83 | | 2 | B | f | 79 | | 3 | C | m | 76 | | 4 | D | m | 80 | | 5 | B | m | 92 | | 6 | A | f | 85 | | 7 | C | m | 76 | +------+------+--------+-------+

假如想要查询grade表中学生的姓名、性别和分数信息,且要求学生的姓名、性别和分数三者不同时重复,这个时候可以使用distinct关键字。

select distinct name,gender,score from grade; # 查询结果为: +------+--------+-------+ | name | gender | score | +------+--------+-------+ | A | f | 83 | | B | f | 79 | | C | m | 76 | | D | m | 80 | | B | m | 92 | | A | f | 85 | +------+--------+-------+

假如想要查询grade表中学生的所有信息,且只要求学生的姓名不重复,此时则不能再用distinct关键字。因为除用于聚合函数中外,distinct关键字必须位于所有字段的前面,且作用于其后所有字段。这种查询要求其实可以用group by实现:

select id,name,gender,score from grade group by name; # 查询结果为: +------+------+--------+-------+ | id | name | gender | score | +------+------+--------+-------+ | 1 | A | f | 83 | | 2 | B | f | 79 | | 3 | C | m | 76 | | 4 | D | m | 80 | +------+------+--------+-------+

假如想要查询grade表中学生的姓名、性别和分数信息,且要求学生的姓名和性别二者不同时重复。此时仍然可以利用group by:

select id,name,gender,score from grade group by name,gender; # 查询结果为: +------+------+--------+-------+ | id | name | gender | score | +------+------+--------+-------+ | 1 | A | f | 83 | | 2 | B | f | 79 | | 5 | B | m | 92 | | 3 | C | m | 76 | | 4 | D | m | 80 | +------+------+--------+-------+ # 与原表grade比较可知上述查询结果是正确的。

以上查询使用的MySQL版本是5.7。

总结:在去重查询时,distinct关键字只能返回它的目标字段,而无法同时返回其它字段,要想解决这个问题,可以利用group by按照多列进行嵌套分组。

---------------------------------------------------更新于2019-03-03---------------------------------------------------

当MySQL版本更新为8.0.13后,对于上文中同样的查询,如想要查询grade表中学生的姓名、性别和分数信息,且要求学生的姓名和性别二者不同时重复。此时再次查询select id,name,gender,score from grade group by name,gender时,出现如下报错:

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.grade.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by。

这是因为当sql_mode=only_full_group_by时,select后跟的字段名必须和group by后跟的字段名保持一致。为解决这个问题,我们可以更改会话系统变量的值,在会话变量sql_mode中,删去only_full_group_by。具体操作如下:

先查看当前会话变量sql_mode的值:

更改当前会话变量sql_mode的值:

查看更改后的会话变量sql_mode的值:

再次执行相同查询:

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3