Mysql Удаление из базы значений, больше определенного количества

kotkew

Новичок
Здравствуйте, уважаемые.
Возник следующий вопрос:
Есть таблица, состоящая из уникального ид и значения.
Как удалить из таблицы записи с одинаковыми значениями, встречающиеся больше х раз, в порядке убывания уникального ида?

Заранее благодарен =)
 

fixxxer

К.О.
Партнер клуба
В mysql нельзя использовать подзапросы в delete statement на ту же таблицу, откуда delete, так что либо транзакцию и 2 запроса, либо можно использовать join.

Для x = 1 с джойном как-то так:

delete t1 from foo t1 inner join foo t2 on (t2.value = t1.value and t2.id > t1.id);

Для x = N - соответственно N джойнов.
 

kotkew

Новичок
В mysql нельзя использовать подзапросы в delete statement на ту же таблицу, откуда delete, так что либо транзакцию и 2 запроса, либо можно использовать join.

Для x = 1 с джойном как-то так:

delete t1 from foo t1 inner join foo t2 on (t2.value = t1.value and t2.id > t1.id);

Для x = N - соответственно N джойнов.
А можно ли удалить все записи, встречающиеся более х раз, но не х записей?
 

hell0w0rd

Продвинутый новичок
самое простое, работающее в любой базе:
Код:
delete from table where id in (select id from table ...)
PS еще плюс такого подхода - можно посмотреть, что удаляешь, пока формируешь запрос руками. Вытаскиваешь select и сначала его пишешь, тестишь.
 

fixxxer

К.О.
Партнер клуба
А вообще при чем тут джойны? group by + having, не?
Эм, я так понял, что надо удалить из дубликатов только count - limit самых старых. Иначе непонятно, причем тут "в порядке убывания".
Если все, то да, так.
 

Тугай

Новичок
Код:
set @X = 3;

delete from tbl
where id not in (
    select m_id from (
        select max(id) as m_id, count(val) as cnt
        from tbl
        group by val
        having cnt > @X
    ) as tmp_tbl
);
 
Сверху