Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Удаление строк дубликатов. / 9 сообщений из 9, страница 1 из 1
26.12.2016, 21:23
    #39375638
m0g0r
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк дубликатов.
Доброго времени суток!
Есть таблица ID | INT | TEXT
Мне нужно из неё удалить строки дубликаты в которых совпадают INT и TEXT, что бы оставалась та строка в который id максимальный.
Например:
1 | 123 | text0
2 | 123 | text1
3 | 123 | text1 -удалить
4 | 123 | text1 -удалить
5 | 123 | text1 -удалить
6 | 123 | text2

Пробовал через временную таблицу, но она мне все удаляет, кроме max id, где то я ошибся.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TEMPORARY TABLE `t_temp` 
as  (
   SELECT min(id) as id
   FROM `table`
   GROUP BY int, text
);

DELETE from `table`
WHERE `table`.id not in (
   SELECT id FROM t_temp
);
...
Рейтинг: 0 / 0
26.12.2016, 21:53
    #39375651
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк дубликатов.
Код: sql
1.
2.
3.
4.
5.
6.
DELETE FROM `table`
WHERE (ID, `INT`, `TEXT`) NOT IN (
                                  SELECT MAX(ID),`INT`,`TEXT`
                                  FROM `table`
                                  GROUP BY `INT`,`TEXT`
                                 );
...
Рейтинг: 0 / 0
26.12.2016, 21:55
    #39375653
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк дубликатов.
Если ID уникальный, то достаточно
Код: sql
1.
2.
3.
4.
5.
6.
DELETE FROM `table`
WHERE ID NOT IN (
                  SELECT MAX(ID)
                  FROM `table`
                  GROUP BY `INT`,`TEXT`
                 );
...
Рейтинг: 0 / 0
27.12.2016, 13:59
    #39376052
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк дубликатов.
Akina,
а это работающая конструкция? Пишут, что
You cannot delete from a table and select from the same table in a subquery.
...
Рейтинг: 0 / 0
27.12.2016, 14:06
    #39376058
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк дубликатов.
paver,

используйте вложенный запрос или через join
примеры есть в этой статье
...
Рейтинг: 0 / 0
27.12.2016, 14:17
    #39376075
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк дубликатов.
Это как бы идея. Да, влоб не сработает. Но сработает, если подзапрос оформить как представление:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE VIEW not_del 
AS
SELECT MAX(id) id
FROM `table`
GROUP BY `int`,`text`;

DELETE FROM `table`
WHERE id NOT IN (
                 SELECT id
                 FROM not_del
                );



Альтернатива - перенос подзапроса в секцию FROM:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
DELETE table.*
FROM table
LEFT JOIN (
           SELECT MAX(id) id
           FROM `table`
           GROUP BY `int`,`text`
) not_del ON table.id = not_del.id
WHERE not_del.id IS NULL;



Да, всё это - только если `id` UNIQUE.
...
Рейтинг: 0 / 0
27.12.2016, 14:31
    #39376099
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк дубликатов.
авторYou cannot delete from a table and select from the same table in a subquery.
Обходится ещё одним подзапросом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
DELETE FROM `table`
WHERE id NOT IN (
    select id from (
                 SELECT id
                 FROM not_del
                ) as sl
);


В этом случае подзапрос неявно уезжает во временную табличку и теряет связь с delete.

Либо delete с join'ом подзапроса, что обходит это ограничение mysql тем же самым способом.
...
Рейтинг: 0 / 0
27.12.2016, 14:33
    #39376101
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк дубликатов.
Akina,

ещё (как рекомендует документация) можно делать обертку

Код: sql
1.
2.
3.
4.
5.
6.
DELETE FROM `table`
WHERE ID NOT IN (select * from (
                  SELECT MAX(ID)
                  FROM `table`
                  GROUP BY `INT`,`TEXT`
                 ));
...
Рейтинг: 0 / 0
28.12.2016, 08:04
    #39376513
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строк дубликатов.
Оптимум, как понимаю, будет так:
Код: sql
1.
2.
3.
DELETE t1
FROM table t1
JOIN table t2 ON t1.int = t2.int AND t1.text = t2.text AND t1.id < t2.id
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Удаление строк дубликатов. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]