Programming/SQL / / 2022. 6. 16. 17:28

[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).

반응형