하나의 sql 문 구 를 완성 하고 MySQL 을 다시 남 깁 니 다.

3519 단어 MySQL 리 셋
며칠 전에 필요 한 것 을 만 들 때 my sql 에서 중복 되 는 기록 을 정리 해 야 합 니 다.그 당시 의 생각 은 코드 를 통 해 옮 겨 쓴 다음 에 너무 복잡 하 다 고 생각 했 습 니 다.마음 속 으로 는 sql 문 구 를 통 해 문 제 를 해결 할 수 있 을 것 이 라 고 생각 했 습 니 다.자 료 를 찾 아 본 후에 큰 사람 에 게 가르침 을 청 한 후에 매우 편리 한 sql 문 구 를 얻 었 습 니 다.여기 서 이 sql 문구 와 방향 을 공유 하 겠 습 니 다.
수요 분석
데이터베이스 에 중복 기록 이 존재 합 니 다.그 중 하 나 를 삭제 합 니 다.(중복 판단 기준 이 여러 필드 인지 여부)
해결 방안
이 수요 에 부 딪 혔 을 때,마음속 에는 아마도 생각 이 있 을 것 이다.가장 빨리 생각 나 는 것 은 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 수준 도 일반적인 차원 에 있 을 뿐 입 니 다.나중에 기 회 를 봐 서 이 분야 의 지식 을 보충 해 야 합 니 다.
오늘 은 여기까지.

좋은 웹페이지 즐겨찾기