Удалить дубли - запрос SQL

12
D
На сайте с 28.06.2008
Offline
1114
741

Есть таблица working - в которой есть поля item_id и c_id

И довольно часто есть дубли - записи с одинаковыми item_id и c_id ?

пример на скрине. Как мне удалить дубли, чтобы остался только один вариант?

png 167066.png
dma84
На сайте с 21.04.2009
Offline
168
#1

ALTER IGNORE TABLE `working` ADD UNIQUE INDEX (`item_id`, `c_id`);

ALTER TABLE `working` DROP INDEX (`item_id`, `c_id`);

Хотя, я бы оставил уникальный индекс, чтобы в дальнейшем дубли не появлялись

D
На сайте с 28.06.2008
Offline
1114
#2
dma84:
ALTER IGNORE TABLE `working` ADD UNIQUE INDEX (`item_id`, `c_id`);

#1062 - Дублирующаяся запись '286075-0' по ключу 'item_id'

Не получится поставить уникальный индекс - дубли же есть :)))

S
На сайте с 09.10.2007
Offline
186
#3

IGNORE в запросе как раз должно было бы убрать эту досадную ошибку

Удобная панель для доменных имен (http://panel.started.ru/) с массовыми операциями. Индивидуальные цены по запросу.
C
На сайте с 04.02.2005
Offline
291
#4


CREATE TEMPORARY TABLE `t_temp`
as (
SELECT min(id) as id
FROM `t`
GROUP BY a, b
);

DELETE FROM t
WHERE id NOT IN (SELECT * FROM t_temp);

Если долго мучиться, что-нибудь получится. Если таблица большая, то возможен вариант с HAVING, чтобы уменьшить временную таблицу


CREATE TEMPORARY TABLE `t_temp`
as (
SELECT min(id) as id
FROM `t`
GROUP BY a, b
HAVING COUNT(id) > 1
);

Оба запроса выполнить в одном сеансе.

---------- Добавлено 29.09.2017 в 11:33 ----------


CREATE TEMPORARY TABLE `t_temp`
as (
SELECT min(id) as id
FROM `t`
GROUP BY a, b
);

DELETE FROM t
WHERE id NOT IN (SELECT * FROM t_temp);

Если долго мучиться, что-нибудь получится. Если таблица большая, то возможен вариант с HAVING, чтобы уменьшить временную таблицу


CREATE TEMPORARY TABLE `t_temp`
as (
SELECT min(id) as id
FROM `t`
GROUP BY a, b
HAVING COUNT(id) > 1
);

Оба запроса выполнить в одном сеансе.

D
На сайте с 28.06.2008
Offline
1114
#5

Chukcha, я наверное не догоняю - а где в ваших примерах анализ полей

`item_id`, `c_id` ?

Как же оно найдет дубли?

C
На сайте с 04.02.2005
Offline
291
#6

А GROUP BY зачем?

D
На сайте с 28.06.2008
Offline
1114
#7

Так должно быть?

CREATE TEMPORARY TABLE `t_temp`
as (
SELECT min(id) as id
FROM `working`
GROUP BY item_id, c_id
);

DELETE FROM working
WHERE id NOT IN (SELECT * FROM t_temp);
C
На сайте с 04.02.2005
Offline
291
#8


CREATE TEMPORARY TABLE `t_temp`
as (
SELECT min(id) as id
FROM `working`
GROUP BY item_id, c_id
HAVING COUNT(*) > 1
);

Перед использованием проверьте


SELECT min(id) as id
FROM `working`
GROUP BY item_id, c_id
HAVING COUNT(*) > 1
D
На сайте с 28.06.2008
Offline
1114
#9

проверил, нашло 72 дубля.

добавил к запросу

DELETE FROM working

WHERE id NOT IN (SELECT * FROM t_temp);

в итоге удалило все нафиг кроме этих 72 записей :))))

C
На сайте с 04.02.2005
Offline
291
#10

Да, кажется с having я погорячился.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий