Удалить записи кроме последних

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.239
Приветствую,

Есть таблица, где сохраняются "состояния" пользователя. В ней есть id, name, group_id и user_id

Раньше при изменении состояния, просто добавлялась новая запись. Сейчас будет последняя обновляться.

Надо все, кроме последних состояний удалить.

Если user_id одинаковый, а group_id разный - эти записи оставить. Это разные состояния

Например:
Код:
id  |   name   |   group_id    |   user_id
1   |  Витя    |      3        |     6
2   |  Вася    |      3        |     6
3   |  Петя    |      4        |     6
Тут повторяются записи с id 1 и 2. Надо удалить id 1

По моему, понятно... :)
 
Последнее редактирование:

skyd3x

Создатель
Регистрация
7 Янв 2016
Сообщения
37
Реакции
29
DELETE FROM TABLE WHERE name = 'Витя' AND ID NOT IN (SELECT MAX(ID) FROM TABLE);
 

E6yH

Постоялец
Регистрация
9 Окт 2016
Сообщения
30
Реакции
13
Код:
SELECT
    *
FROM
    t t1
WHERE
    t1.id = (SELECT
            MAX(id)
        FROM
            t
        WHERE
            t.user_id = t1.user_id
                AND t.group_id = t1.group_id);
Это выберет все твои последние записи. Т.е. удали все кроме них.
 

Dmytrodddddd

Постоялец
Регистрация
23 Мар 2017
Сообщения
38
Реакции
36
Добрый день, подскажите пожалуйста. А если необходимо удалить запись под нечетными номерами, как это можно сделать??
 

Цуиьфыеук

Создатель
Регистрация
15 Янв 2018
Сообщения
36
Реакции
19
Сгруппировать по group_id и user_id, получить список max(id), после этого удалить все записи с id не входящими в этот список
 

leonidas56

Писатель
Регистрация
23 Окт 2018
Сообщения
4
Реакции
1
just delete where id is different from the max id
 

ElenaBeck123!

Создатель
Регистрация
24 Май 2017
Сообщения
20
Реакции
7
вот так удаляем старые записи, все кроми последних сгруппированных по group_id и user_id
если нужно удалить только нечетные записи расскоментируйте строчку с AND IF в самом конце.
table1 замените на свое название таблицы.

DELETE FROM table1 WHERE ID IN (
SELECT id FROM (
SELECT
@row_number:=CASE WHEN @groupid = group_id AND @userid = user_id THEN row_number + 1 ELSE 1 END AS num,
@groupid:=group_id as group_id,
@userid:=user_id as user_id,
id,
name​
FROM
table1​
ORDER BY
group_id, user_id, id DESC​
) A WHERE
A.num > 1
-- AND IF(LEFT(id, 1) % 2 <> 0, 1, 0) = 1 -- нечетные id​
)
 
Сверху