본문 바로가기

Programming/SQL

[MySQL]특정 조건에 포함되지 않는 모든 데이터 삭제하기

728x90

위 이미지는 번호(no)를 기준으로 내림차순으로 정렬한 것입니다.

여기에서 해야 할 게 최근에 등록한 10개를 빼고는 다 삭제를 해야 합니다.

그러려면 ORDER BY `no` DESC / LIMIT 10 이걸 두 개 얼추 조합해서 NOT IN을 하면 되지 않을까 생각합니다. 그런데 MySQL에서는 아직 안 됩니다.

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

이런 오류를 띄우고 멈춥니다.

SELECT MIN(`no`) FROM (SELECT `no` FROM `da_temporary_save` WHERE `userid` = 'test' ORDER BY `no` DESC LIMIT 10) AS xxxx

이미지에서는 userid가 모두 test지만 실제로는 다른 것들도 있을 테니 우선 test로 된 것만 조건을 걸고 등록된 순서(ORDER BY `no` DESC)대로 10개의(LIMIT 10) 데이터(no)를 갖고 옵니다.

위 이미지에서 등록된 순서대로 10개만 역순으로 갖고 오면 17 ~ 26입니다. 그러면 여기에서 no가 17보다 작은 것들만 삭제를 하면 됩니다.

DELETE FROM `da_temporary_save` WHERE `userid` = 'test' AND `no` < (SELECT MIN(`no`) FROM (SELECT `no` FROM `da_temporary_save` WHERE `userid` = 'test' ORDER BY `no` DESC LIMIT 22) AS xxxx)

참고로 MIN(`no`)을 안 하면 서브 쿼리에서 1개보다 많은 row가 있다고 뭐라고 합니다(Subquery returns more than 1 row).

반응형

'Programming > SQL' 카테고리의 다른 글

[MySQL]TIMESTAMPDIFF() 시간, 날짜 차이  (0) 2022.12.01
[MySQL]정렬 순서가 있는 게 먼저 나오고 없는 게 나중에...  (0) 2021.12.09
[MySQL]ORDER BY  (0) 2020.03.10
[MySQL]ORDER BY  (0) 2020.02.26
[MySQL]ORDER BY  (0) 2020.02.26