Mysql Duplicate Rows (Дубликат обнаружен с использованием двух столбцов)
Как удалить дубликаты в этой настройке?
id A B
----------------
1 apple 2
2 orange 1
3 apple 2
4 apple 1
Здесь я хочу удалить (apple, 2), который происходит дважды. Номера идентификаторов уникальны. Я бы использовал ключевое слово DISTINCT, если бы оно не было. Могу ли я каким-то образом сделать ключ из столбцов A и B, а затем использовать ключевое слово DISTINCT для этого, чтобы получить то, что мне нужно? Большое спасибо за ваши ответы.
Ответы
Ответ 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
. Возможно, вы можете опубликовать пример типа результата, который вы хотели бы видеть.