mysql重複データの処理

1592 ワード

idを除いて、他のデータは同じである部分的な重複データを含む表があると仮定します.
id
student_id
name
course_id
course_name
score
1
2005001
張三
1
数学
69
2
2005002
李四
1
数学
89
3
2005001
張三
1
数学
69
CREATE TABLE `test` (
  `id`          INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `student_id`  INT UNSIGNED NOT NULL,
  `name`        VARCHAR(20)  NOT NULL,
  `course_id`   INT UNSIGNED NOT NULL,
  `course_name` VARCHAR(20)  NOT NULL,
  `score`       INT UNSIGNED NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE = InnoDB;

INSERT INTO `test` (`student_id`, `name`, `course_id`, `course_name`, `score`)
VALUES (2005001, '  ', 1, '  ', 69),
       (2005002, '  ', 1, '  ', 89),
       (2005001, '  ', 1, '  ', 69);

1.重複データのフィルタgroup byで検索すると重複データをフィルタできます
SELECT `student_id`, `name`, `course_id`, `course_name`, `score` FROM `test`
  GROUP BY `student_id`, `name`, `course_id`, `course_name`, `score`;

2.統計重複データ
SELECT count(1) AS `repetitions`, `name` FROM `test`
  GROUP BY `student_id`, `name`, `course_id`, `course_name`, `score`
  HAVING `repetitions` > 1;

3.重複データの削除
考え方:グループ化後、idの最小の1つを選択し、選択されていないidをすべて削除します.
DELETE FROM `test`
WHERE `id` NOT IN (
  SELECT `min_id`
  FROM (SELECT min(`id`) AS `min_id`
        FROM `test`
        GROUP BY `student_id`, `name`, `course_id`, `course_name`, `score`) AS `a`
);