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]You can't specify target table 테이블명 for update in FROM clause (1) | 2024.04.03 |
---|---|
[MySQL]TIMESTAMPDIFF() 시간, 날짜 차이 (0) | 2022.12.01 |
테이블 구조(MySQL) 쿼리로 갖고 오기 (0) | 2022.02.04 |
[MySQL]정렬 순서가 있는 게 먼저 나오고 없는 게 나중에... (0) | 2021.12.09 |
[MySQL]ORDER BY (0) | 2020.03.10 |