mysql刪除重複數據,只保留一條有效數據

建表

CREATE TABLE `courses` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增id',
`student` VARCHAR(255) DEFAULT NULL COMMENT '學生',
`class` VARCHAR(255) DEFAULT NULL COMMENT '課程',
`score` INT(255) DEFAULT NULL COMMENT '分數',
PRIMARY KEY (`id`),
UNIQUE KEY `course` (`student`, `class`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入語句

insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '1', '90', 'A', 'Math');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '2', '80', 'A', 'Chinese');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '3', '70', 'A', 'English');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '4', '80', 'A', 'History');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '5', '73', 'B', 'Math');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '6', '60', 'B', 'Chinese');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '7', '70', 'B', 'English');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '8', '90', 'B', 'History');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '9', '70', 'C', 'Math');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '10', '50', 'C', 'Chinese');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '11', '20', 'C', 'English');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '12', '10', 'C', 'History');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '13', '53', 'D', 'Math');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '14', '32', 'D', 'Chinese');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '15', '99', 'D', 'English');
insert into `foodie-shop-dev`.`courses` ( `id`, `score`, `student`, `class`) values ( '16', '100', 'D', 'History');

查詢數據
在這裏插入圖片描述
現在我只需要保留每個學生的一條成績,不論科目
首先使用group by 進行分組,然後再留一條id最小的數據

delete from courses 
where 1=1 
and student in(  select student from courses group by student having count(*)>1))
and id not in( select ANY_VALUE(id) from courses group by student having min(id)) ;

執行報錯:

Error : You can't specify target table 'courses' for update in FROM clause

意思是說,不能先select出同一表中的某些值,再update這個表(在同一語句中)

將語句改爲:

delete from courses 
where 1=1 
and student in( select * from ((select student from courses group by student having count(*)>1)) a )
and id not in(select * from (select ANY_VALUE(id) from courses group by student having min(id)) b );

得出結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章