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

Тема в разделе "Базы данных", создана пользователем Q_BASIC, 2 сен 2017.

Модераторы: latteo
  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    468
    Симпатии:
    1.174
    Приветствую,

    Есть таблица, где сохраняются "состояния" пользователя. В ней есть 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

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

    skyd3x Создатель

    Регистр.:
    7 янв 2016
    Сообщения:
    28
    Симпатии:
    26
    DELETE FROM TABLE WHERE name = 'Витя' AND ID NOT IN (SELECT MAX(ID) FROM TABLE);
     
  3. E6yH

    E6yH Создатель

    Регистр.:
    9 окт 2016
    Сообщения:
    16
    Симпатии:
    10
    Код:
    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);
    Это выберет все твои последние записи. Т.е. удали все кроме них.
     
  4. Dmytrodddddd

    Dmytrodddddd Создатель

    Регистр.:
    23 мар 2017
    Сообщения:
    28
    Симпатии:
    21
    Добрый день, подскажите пожалуйста. А если необходимо удалить запись под нечетными номерами, как это можно сделать??
     
  5. Цуиьфыеук

    Цуиьфыеук Создатель

    Регистр.:
    15 янв 2018
    Сообщения:
    38
    Симпатии:
    18
    Сгруппировать по group_id и user_id, получить список max(id), после этого удалить все записи с id не входящими в этот список
     
  6. Freeman08

    Freeman08 Создатель

    Регистр.:
    27 сен 2008
    Сообщения:
    28
    Симпатии:
    7
    Кажется как то так: SELECT * FROM table_name WHERE id % 2 != 0
     
  7. leonidas56

    leonidas56 Писатель

    Регистр.:
    23 окт 2018
    Сообщения:
    5
    Симпатии:
    0
    just delete where id is different from the max id
     
  8. ElenaBeck123!

    ElenaBeck123! Создатель

    Регистр.:
    24 май 2017
    Сообщения:
    20
    Симпатии:
    5
    вот так удаляем старые записи, все кроми последних сгруппированных по 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​
    )