удалить дубликаты и сохранить MAX (ID) MySQL - PullRequest
0 голосов
/ 02 октября 2018

У меня есть код, в котором перечислены все дубликаты данных в базе данных

SELECT MAX(id) id 
FROM el_student_class_relation 
GROUP BY student_id, class_id 
HAVING COUNT(*) > 1

Теперь я пытаюсь сохранить MAX (id), тогда остальные дубликаты должны быть удалены

Я попробовал код

DELETE us 
FROM el_student_class_relation us
INNER JOIN(SELECT MAX(id) id 
            FROM el_student_class_relation 
            GROUP BY student_id, class_id HAVING COUNT(*) > 1) t ON t.id = us.id

Но он удаляет MAX (ID) и сохраняет другие дубликаты, и это противоположно тому, что я хочу.

Ответы [ 4 ]

0 голосов
/ 02 октября 2018

Непосредственным исправлением для вашего запроса является использование «анти-объединения», где НЕ объединение является важной функцией.Это можно сделать с помощью LEFT JOIN.

DELETE
  us 
FROM
  el_student_class_relation us
LEFT JOIN
(
  SELECT student_id, class_id, MAX(id) id 
    FROM el_student_class_relation 
GROUP BY student_id, class_id
-- HAVING COUNT(*) > 1  [Don't do this, you need to return ALL the rows you want to keep]
)
  gr
    ON gr.id = us.id
WHERE
  gr.id IS NULL  -- WHERE there wasn't a match in the "good rows" table

EDIT MariaDB и MySQL - это не одно и то же.MariaDB разрешает самостоятельные объединения на удаляемой таблице из.

0 голосов
/ 02 октября 2018

Попробуйте это

DELETE FROM el_student_class_relation 
WHERE id not in 
( 
        SELECT * from 
            (SELECT MAX(id) id 
            FROM el_student_class_relation 
            GROUP BY student_id, class_id) temp_tbl
) 

Обратите внимание : не используйте HAVING COUNT (*)> 1 во внутреннем запросе.это создаст проблему, когда будет только одна запись с одинаковым идентификатором.

0 голосов
/ 02 октября 2018

в mysql (более низкая версия), если подзапрос удаления работает немного по-другому, вам нужно использовать слой больше, чем требуется

DELETE FROM el_student_class_relation us
WHERE us.id not in 
( 
   select * from (
            SELECT MAX(id) id 
            FROM el_student_class_relation 
            GROUP BY student_id, class_id 
            ) t1
) 
0 голосов
/ 02 октября 2018

Вы можете попробовать следующий запрос, который удаляет все элементы, для которых существует другой с более высоким ID (и того же класса и ученика):

DELETE
FROM   el_student_class_relation el1
WHERE  EXISTS (SELECT el2.id
               FROM   el_student_class_relation el2
               WHERE  el1.student_id = el2.student_id
                 AND  el1.class_id = el2.class_id
                 AND  el2.id > el1.id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...