2011-02-10 4 views
4

힘든 방법입니다. 다른 필드의 각 고유 값에 대해 마지막 행을 제외한 모든 행을 어떻게 삭제합니까?SQL 각 고유 값에 대해 마지막 N 행을 제외한 모든 행을 삭제합니다.

여기에 문제의 시각적는 다음과 같습니다

이 가
id | otherfield 
--------------- 
1 | apple  <- DELETE 
2 | banana  <- KEEP 
3 | apple  <- DELETE 
4 | apple  <- KEEP 
5 | carrot  <- KEEP 
6 | apple  <- KEEP 
7 | apple  <- KEEP 
8 | banana  <- KEEP 

가 어떻게 SQL에이를 것 ?

+0

찾을 뭔가 가까운, 그러나에 기초하지 않습니다 다른 필드의 각 고유 값 : http://stackoverflow.com/questions/4720996/delete-n-number-of-old-records-from-table-in-mysql – user546911

+0

WINDOW 확장 프로그램이 해결하도록 설계된 것과 같은 소리가납니다. 하지만 난 몰라. 귀하의 질문에 대답하기 위해 mysql에서 그것 또는 그것의 지원에 대해 어쩔 수 없습니다. – SpliFF

+0

테이블에 몇 개의 레코드가 있습니까? –

답변

1

비 테스트하지만,이 라인을 따라 뭔가가 작동 할 수 있습니다 :

DELETE t.* 
FROM table t JOIN (
    SELECT id 
     @rowNum := IF(@otherfield <> otherfield, 1, @rowNum + 1) rn, 
     @otherfield := otherfield otherfield 
    FROM (
     SELECT id, otherfield 
     FROM table 
     ORDER BY otherfield, id DESC 
    ) t, (SELECT @otherfield := NULL, @rowNum := -1) dm 
) rs ON t.id = rs.id 
WHERE rs.rn > 3 
+0

# 1064 - SQL 구문에 오류가 있습니다. 올바른 구문을 보려면 MySQL 서버 버전에 해당하는 매뉴얼을 확인하십시오. 테이블 히스토리 JOIN (SELECT id @rowNum : = IF (@page <> 페이지, 1, @ro, 2 행 DELETE 내역). * TABLE 기록에서 ( SELECT 아이디 @ ROWNUM을 조인 = IF (@page <> PAGE, 1 @rowNum +1) RN, @page를 = PAGE의 PAGE 을 ( SELECT ID, PAGE 부터 표 PAGE BY ORDER, 아이디 DESC ) 역사 ( SELECT @page : = NULL, @rowNum : = -1 ) DM ) history.id = rs.idON RSWHERE rs.rn> 3 – user546911

+0

@ user546911 테이블 이름으로'table'을 대체하십시오. 질의에'table'이라는 단어를 사용하지 마십시오. –

1
Delete MyTable 
Where Id In (
      Select Id 
      From (
        Select Id 
         , (Select COUNT(*) 
          From MyTable As T2 
          Where T2.OtherField = T.OtherField 
           And T2.Id > T.Id) As Rnk 
        From MyTable As T 
        ) As Z 
      Where Z.Rnk > 2  
      ) 

조금 빠를 수도 다른 버전 :

Delete MyTable 
Where Id In (
      Select T.Id 
      From MyTable As T 
       Left Join MyTable As T2 
        On T2.OtherField = T.OtherField 
         And T2.Id > T.Id 
      Group By T.Id 
      Having Count(T2.Id) > 2 
      ) 
+0

2 버전 촬영 : #을 1054 - 역사 ( SELECT T.id IN ID가 T 좌 T2 ON T2 역사를 가입 AS WHERE 알 수없는 열 '절에'의 'T2.page' 역사에서 삭제 .page = T.page 및 T2.id> T.id GROUP BY T.id (T2.id)> 2 ) – user546911

+0

@ user646911 - 내 쿼리의 아무 곳도 'T2.page'를 참조하지 않았습니다. 나는 그 오류를 어떻게 겪었는지 이해하지 못합니다. – Thomas

+0

@ user646911 - 오류는'history' 테이블에서'page' 열을 찾지 못함을 의미합니다. 정확히 철자가 있고 올바르게 대문자로 표기 되었습니까? – Thomas

관련 문제