Удалить все кроме одной повторяющейся записи - PullRequest
28 голосов
/ 04 мая 2011

У меня есть таблица, которая должна вести учет посетителей данного профиля (идентификатор пользователя для пары идентификаторов пользователей).Оказывается, мой SQL-запрос был немного отключен и выдает несколько пар вместо отдельных, как и предполагалось.Оглядываясь назад, я должен был установить уникальное ограничение для каждой пары id + id.

Теперь, как мне очистить таблицу?Я хочу удалить все дублирующиеся пары и оставить только одну.

Так, например, измените это:

23515 -> 52525 date_visited
23515 -> 52525 date_visited
23515 -> 52525 date_visited
12345 -> 54321 date_visited
12345 -> 54321 date_visited
12345 -> 54321 date_visited
12345 -> 54321 date_visited
23515 -> 52525 date_visited
...

На это:

23515 -> 52525 date_visited
12345 -> 54321 date_visited

Обновление:Вот структура таблицы в соответствии с запросом:

id  int(10)         UNSIGNED    Non     Aucun   AUTO_INCREMENT
profile_id  int(10)         UNSIGNED    Non     0 
visitor_id  int(10)         UNSIGNED    Non     0
date_visited    timestamp           Non     CURRENT_TIMESTAMP   

Ответы [ 4 ]

47 голосов
/ 04 мая 2011

Использовать group by в подзапросе:

delete from my_tab where id not in 
(select min(id) from my_tab group by profile_id, visitor_id);

Вам нужен какой-то уникальный идентификатор (здесь я использую id).

ОБНОВЛЕНИЕ

Как указывает @JamesPoulson, это вызывает синтаксическую ошибку в MySQL;правильное решение (как показано в ответ Джеймса ):

delete from `my_tab` where id not in
( SELECT * FROM 
    (select min(id) from `my_tab` group by profile_id, visitor_id) AS temp_tab
);
14 голосов
/ 04 мая 2011

Вот решение Фрэнка Шмитта с небольшим обходным решением для временной таблицы:

delete from `my_tab` where id not in
( SELECT * FROM 
    (select min(id) from `my_tab` group by profile_id, visitor_id) AS temp_tab
)
3 голосов
/ 21 декабря 2017

Это будет работать:

With NewCTE
AS
(
Select *, Row_number() over(partition by ID order by ID)as RowNumber from 
table_name
)
Delete from NewCTE where RowNumber > 1
2 голосов
/ 04 мая 2011

Выбрать все уникальные строкиСкопируйте их в новую временную таблицуУсеченный оригинальный столСкопировать данные временной таблицы в исходную таблицуЭто то, что я бы сделал.Я не уверен, есть ли 1 запрос, который бы сделал все это для вас.

...