MySQL多字段去重 |
您所在的位置:网站首页 › district去重多个字段 › MySQL多字段去重 |
# 创建学生成绩表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 |