하나의 sql 문 구 를 완성 하고 MySQL 을 다시 남 깁 니 다.
3519 단어 MySQL 리 셋
수요 분석
데이터베이스 에 중복 기록 이 존재 합 니 다.그 중 하 나 를 삭제 합 니 다.(중복 판단 기준 이 여러 필드 인지 여부)
해결 방안
이 수요 에 부 딪 혔 을 때,마음속 에는 아마도 생각 이 있 을 것 이다.가장 빨리 생각 나 는 것 은 sql 문 구 를 통 해 해결 할 수 있다 는 것 입 니 다.어 쩔 수 없 이 복잡 한 sql 문 구 를 하 는 방법 이 너무 얕 아서 큰 사람 에 게 도움 을 청 하고 싶 습 니 다.
도움 을 청 하 다
이 수요 가 좀 급 하기 때문에 처음에 생각 한 것 은 이 분야 의 동업 자 를 찾 아 해결 할 수 있다 는 것 이다.그리고 이 문 제 를 동료 에 게 공유 할 수 있다 는 것 이다.결국 이 물건 은 바 이 두 를 대충 훑 어 보 았 고 나 에 게 사용 해 본 적 이 없 는 sql 문 구 를 던 져 주 었 다.나 는 스스로 시도 해 보 았 다.마음 속 에 있 는 것 이 무엇이든 뛰 어 넘 었 다.
자기 바 이 두
sql 문 구 를 찾 았 습 니 다:
DELETE
FROM
vitae a
WHERE
(a.peopleId, a.seq) IN (
SELECT
peopleId,
seq
FROM
vitae
GROUP BY
peopleId,
seq
HAVING
count(*) > 1
)
AND rowid NOT IN (
SELECT
min(rowid)
FROM
vitae
GROUP BY
peopleId,
seq
HAVING
count(*) > 1
)
이 문 구 는[MySQL 에서 중 복 된 데 이 터 를 삭제 하고 하나만 보존 합 니 다]이 글 에서 찾 았 습 니 다.이 sql 의 사고방식 은 매우 뚜렷 하 다.다음 과 같은 세 가지 가 있다.4.567914.표 에서 중복 기록 을 조회 하 는 것 을 조건 으로 한다.
SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1
표 에서 중복 기록 중 ID 의 최소 값 을 두 번 째 조건 으로 조회 합 니 다.마지막 으로 상기 두 가지 조건 에 따라 중복 기록 중 최소 ID 를 제외 한 나머지 중복 기록 을 삭제 합 니 다.
그러나 어 쩔 수 없 이 이 문 구 를 실행 하 는 데 오류 가 발생 했 습 니 다.대체적으로 잘못 보고 한 것 은 조회 할 때 이 표를 동시에 업데이트 할 수 없다 는 뜻 입 니 다.
코드 해결
위의 이 sql 구문 에 따 르 면 코드 를 통 해 두 단계 로 같은 목적 을 달성 할 수 있 을 지도 모른다 고 생각 합 니 다.
중복 되 는 데이터 세트 를 먼저 꺼 냅 니 다.
조 회 된 데이터 세트 에 따라 나머지 중복 데 이 터 를 반복 적 으로 삭제 합 니 다.
생각 은 있 고 쓰기 도 빠 르 지만 실행 하 자마자 깜짝 놀 랐 습 니 다.116 s 정도 가 필요 하 다 고 생각 했 습 니 다.그리고 사용 할 수 있 는 sql 문 구 를 찾 아서 코드 와 실행 결 과 를 붙 이 고 싶 었 습 니 다.
완벽 한[다시 남기 기]SQL.
마지막 으로 한 기술 군 에서 완벽 한 답 을 얻 었 습 니 다.이 sql 문 구 를 보 세 요.
DELETE consum_record
FROM
consum_record,
(
SELECT
min(id) id,
user_id,
monetary,
consume_time
FROM
consum_record
GROUP BY
user_id,
monetary,
consume_time
HAVING
count(*) > 1
) t2
WHERE
consum_record.user_id = t2.user_id
and consum_record.monetary = t2.monetary
and consum_record.consume_time = t2.consume_time
AND consum_record.id > t2.id;
위의 이 sql 문 구 를 자세히 보면 생각 을 추측 하 는 것 도 어렵 지 않 고 대략 3 단계 로 나 누 어 이해 합 니 다.4.567914.중복 기록 을 조회 하여 하나의 집합(임시 표 t2)을 형성 하고 집합 은 각 중복 기록 의 최소 ID 이다.
4.567914 관련 판단 중복 기준 필드
조건 에 따라 원 표 의 id 가 t2 의 id 보다 큰 기록 을 삭제 합 니 다.
이 구절 을 보 았 을 때,마음속 으로 이것 도 너무 대단 하 다 고 생각 했다.이렇게 간단 한 sql 문 구 를 이렇게 복잡 한 문 제 를 해결 하고 자 세 를 올 릴 수 있다 니~
운행 도 엄 청 빨 라 요.원래 의 코드 가 순환 적 으로 실행 되 는데 116 s 정도 가 필요 해 요.여기 0.3s 면 돼 요.대단 해 요~
총결산
php 프로그램 원숭이 로 서 이치 에 따 르 면 sql 여 기 는 발목 을 잡 을 수 없습니다.어 쩔 수 없 이 실제 적 으로 바 쁜 일이 너무 많 습 니 다.현재 의 sql 수준 도 일반적인 차원 에 있 을 뿐 입 니 다.나중에 기 회 를 봐 서 이 분야 의 지식 을 보충 해 야 합 니 다.
오늘 은 여기까지.