2011-01-05 2 views
0

궁극적으로 중복 행을 삭제하고 행을 더 큰 숫자 데이터로 유지하려고합니다. 그래서 중복 데이터를 찾기 위해, 내가 사용하는 것이 : MySQL : 어떤 행이 더 큰 값을 갖는지 어떻게 알 수 있습니까?

SELECT * FROM tbl GROUP BY a HAVING COUNT(a)>1

지금 내가 어떻게 열 field_a에서 많은 수의이 행을 찾을 수 있습니까?

+0

MAX() -> http://www.tizag.com/mysqlTutorial/mysqlmax.php – Christophe

+0

을 시도해 봤는데 MAX를 분리하는 데 도움이되지만 MAX가 아닌 다른 모든 것은 삭제해야합니다. 어떻게해야합니까? – Strawberry

+0

tbl WHERE MAX (a) <> 1 (여기서 <>는 의미가 아니므로 최대 값은 1이 아닙니다.) 그러나 먼저 해당 쿼리를 실행하기 전에 select를 사용하여 테스트하십시오. – Christophe

답변

0

아마도 (경찰 아웃의 종류) : 레코드가 같은 최대 값을 가질 때

DELETE t 
FROM t 
EXCEPT (max-query-on-t) 

또한 경우를 고려한다.

0
delete tbl from tbl, 
(
    select a, max(field_a) as max_a 
    from tbl 
    group by a 
    having count(a)>1 
) as max_for_a 
where tbl.a=max_for_a.a and tbl.field_a!=max_for_a.max_a; 

당신이 각각에 대한 field_a에 대한 두 개 이상의 더 큰 가치가 있다면, 그것은 할 수없는 삭제하는 모든

이 문제를 해결하려면, 당신은

select a, count(*) from tbl group by a; 
같은 다른 쿼리를 실행해야합니다

및 각

delete from tbl where a=? limit (total_count-1); 
0

모두 하나 개의 쿼리에서이 작업을 수행하려면, 당신은 고유 키가 필요하고 저장해야 임시 테이블의 중간 결과 :

delete from tbl where tbl.id in (select result.id from (select tbl.id from tbl join (select max(a) as a from tbl) as maxa where tbl.a<>maxa.a) as result) 

나는 이것을 두 개 또는 세 개의 별도의 쿼리로 분할하는 것이 좋습니다.

관련 문제