2011-09-07 5 views
8

테이블에 511 복제본이 있습니다. 원본은 삭제해야하지만 삭제해야합니다. 그러므로 나는 모든 복제물의 매 두 번째 발생을 삭제하려고합니다.MYSQL 테이블에서 가장 먼저 복제본을 삭제하십시오.

어떻게하면됩니까?

표 :

code/ status/ time 
E3F4FF928A/0/
07D95444BB/0/ 
07D95444BB/ 0/
40006C128F/0/1315293012 
2B45790E52 /0/
40006C128F/0/1315293012 
+0

표 정의를 게시하십시오. –

+1

정확히 중복 되었습니까? 아니면 어딘가에 고유 한 열쇠가 있습니까? – Jason

+1

진정한 복제본은 원본의 정확한 복제본입니다. 중복 된 항목이 실제로 있습니까? 아니면 많은 데이터가 동일한 행이 있습니까? 예 : 자동 열 또는 만든 날짜와 다른 내용이 있습니까? – Zak

답변

8

가 고유해야 칼럼에 테이블에 고유 인덱스를 추가하고, 무시 오류

alter ignore table X add unique index (column_a) 

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

+0

주소가 아닙니다. * 모든 중복의 모든 두 번째 항목을 삭제하려고합니다. * –

+0

예. 원하는 결과를 얻지 못했습니다. . –

+1

더 구체적으로 .. 당신은 b a b c b a ...가 있습니다. b c를 원하십니까? 아니면 b c b를 원하십니까? – Zak

0
DELETE t2 FROM table1 t2 
INNER JOIN table1 t1 ON 
     (t1.somefield = t2.somefield 
    AND t1.otherfield = t2.otherfield /*add more fields if need be */ 
    AND t2.id > t1.id) 
LEFT JOIN table1 t3 ON 
     (t1.somefield = t3.somefield 
    AND t1.otherfield = t3.otherfield /*add more fields if need be */ 
    AND t3.id > t2.id) 
WHERE (t3.id IS NULL) 
ORDER BY t2.id ASC 

에만 삭제해야합니다 두 번째 복제본은 3 번째 복제본과 두 번째 복제본을 혼자 남겨 둡니다.

은 당신이 뭔가 덜 난해한하려는 경우, 당신은 아마 당신은 그냥이 문제에 (테이블에는 고유 키)를 오늘 실행되지

DELETE t2 FROM table1 t2 
INNER JOIN table1 t1 ON 
     (t1.somefield = t2.somefield 
    AND t1.otherfield = t2.otherfield /*add more fields if need be */ 
    AND t2.`timestamp` > t1.`timestamp`) 
WHERE (1=1)  /*In some mode(s) MySQL requires a where clause with delete*/ 
ORDER BY t2.id ASC 
1

을하고 싶은, 타임 스탬프 열이 있습니다.

나는 (당신이 N 중복 된 경우, 하나를 유지하기 위해 N-1을 넣어) 지정된 기준에 대한 최초의 1 개 행을 삭제합니다이

DELETE FROM table where code=x and status=y and time=z LIMIT 1; 

이처럼 해결했다.

+0

질문에 대답하지 않습니다. – chuse

관련 문제