powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Удаление строк дубликатов.
9 сообщений из 9, страница 1 из 1
Удаление строк дубликатов.
    #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
Удаление строк дубликатов.
    #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
Удаление строк дубликатов.
    #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
Удаление строк дубликатов.
    #39376052
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
а это работающая конструкция? Пишут, что
You cannot delete from a table and select from the same table in a subquery.
...
Рейтинг: 0 / 0
Удаление строк дубликатов.
    #39376058
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paver,

используйте вложенный запрос или через join
примеры есть в этой статье
...
Рейтинг: 0 / 0
Удаление строк дубликатов.
    #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
Удаление строк дубликатов.
    #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
Удаление строк дубликатов.
    #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
Удаление строк дубликатов.
    #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
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Удаление строк дубликатов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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