Удалить все строки, кроме тех, которые возвращены из запроса - PullRequest
0 голосов
/ 03 мая 2020

Я по ошибке вставляю дубликаты в БД. Я создал запрос, который возвращает все идентификаторы строк, которые я хочу сохранить. Как удалить строки, не указанные в запросе. Можете ли вы включить полный запрос в свой ответ.

select min(matches.`id`)from matches
where  (stream_match_time, track_match_time, user_id, track_id ) in (
  select stream_match_time, track_match_time, user_id, track_id 
  from   matches
  group  by stream_match_time, track_match_time, user_id, track_id 
  having count(*) > 1
)
group  by stream_match_time, track_match_time, user_id, track_id 

1 Ответ

2 голосов
/ 03 мая 2020

Вы можете использовать:

delete from matches where id not in (...)

, но вы должны вложить свой запрос на один уровень глубже, например:

delete from matches
where id not in (
  select id from (
    select min(id) id from matches
    where  (stream_match_time, track_match_time, juked_user_id, track_id ) in (
      select stream_match_time, track_match_time, juked_user_id, track_id 
      from   matches
      group  by stream_match_time, track_match_time, juked_user_id, track_id 
      having count(*) > 1
    )
    group by stream_match_time, track_match_time, juked_user_id, track_id 
  ) t
)

Я думаю, что ваш запрос не нуждается в 2 уровнях агрегирования, так попробуйте также это:

delete from matches
where id not in (
  select id from (
    select min(id) id 
    from   matches
    group by stream_match_time, track_match_time, juked_user_id, track_id 
    having count(*) > 1
  ) t
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...