Подтвердить что ты не робот

Mysql Duplicate Rows (Дубликат обнаружен с использованием двух столбцов)

Как удалить дубликаты в этой настройке?

id    A       B 
----------------
1     apple   2  
2     orange  1       
3     apple   2   
4     apple   1 

Здесь я хочу удалить (apple, 2), который происходит дважды. Номера идентификаторов уникальны. Я бы использовал ключевое слово DISTINCT, если бы оно не было. Могу ли я каким-то образом сделать ключ из столбцов A и B, а затем использовать ключевое слово DISTINCT для этого, чтобы получить то, что мне нужно? Большое спасибо за ваши ответы.

4b9b3361

Ответ 1

delete from myTable 
where id not in
(select min(id)
from myTable
group by A, B)

то есть. выбор в скобках возвращает первый идентификатор для каждой группы A и B; удаление всех идентификаторов, которые не находятся в этом наборе, удалит все вхождения комбинации A-plus-B, которые являются "последующими" к ее первому вхождению.

EDIT: этот синтаксис кажется проблематичным: см. отчет об ошибке:

http://bugs.mysql.com/bug.php?id=5037

Возможное обходное решение заключается в следующем:

delete from myTable 
where id not in
(
      select minid from 
      (select min(id) as minid from myTable group by A, B) as newtable
) 

Ответ 2

Еще один (из http://labs.creativecommons.org/2010/01/12/removing-duplicate-rows-in-mysql/). Добавьте уникальный индекс и удалите его:

ALTER IGNORE TABLE mytable ADD UNIQUE INDEX tmpindex (A,B);
ALTER TABLE mytable DROP INDEX tmpindex;

Ключевое слово IGNORE - это расширение mysql, которое заставляет его отбрасывать строки, которые нарушают ключевое слово UNIQUE, а не просто сбой.

Ответ 3

DELETE FROM fruit_table FT1
WHERE EXISTS
(
    SELECT * FROM fruit_table FT2 
    WHERE FT2.fruit_name_column = FT1.fruit_name_column
    AND   FT2.fruit_integer_column = FT1.fruit_integer_column
    AND   FT2.id <> FT1.id
)

Это предполагает, что вам не важно, какая из дубликатов записей удалена.

Ответ 4

DELETE
FROM mytable
USING mytable, mytable AS vtable
WHERE vtable.id > mytable.id
AND mytable.A = vtable.A
AND mytable.A = vtable.A

Ответ 5

Вы можете использовать временную таблицу с нужными данными:

insert into temp_table
select min(id), A, B
 group by A, B

Ответ 6

Я не совсем уверен, что вы спрашиваете здесь. Если вы не хотите дублировать столбцы A и B, сделайте то, что вы упомянули SELECT DISTINCT A, B FROM XXX. Возможно, вы можете опубликовать пример типа результата, который вы хотели бы видеть.