Mysql 조건 에 따라 여러 가지 실현 방법 에 대한 상세 한 설명

최근 한 사이트 의 백 스테이지 에 일련의 통계 기능 을 추가 하면 서 조건 에 따라 계산 해 야 하 는 경우 가 많다.몇 가지 방법 을 시 도 했 으 니,아래 에 간략하게 기록 하여,여러분 이 참고 하 시기 바 랍 니 다.
문제 설명
토론 을 간단명료 하 게 하기 위해 서 나 는 문 제 를 약간 간소화 하여 많은 배경 을 없 앴 다.
옛날 에 한 황제 가 있 었 습 니 다.그 는 50 명의 비 를 가지 고 있 었 습 니 다.이 비 들 은 천리 에 맞지 않 게 그 에 게 100,000 명의 아들 을 낳 아 주 었 습 니 다.그래서 황 제 는 많은 아들 들 이 관리 하기 어 려 웠 습 니 다.그리고 그 는 모든 비 들 이 그 에 게 얼마나 많은 아들 을 낳 았 는 지 알 고 싶 어서 공 로 를 따 져 상 을 주 었 습 니 다.이것 은 어 려 웠 습 니 다.그래서 황 제 는 프로그래머 에 게 프로그램 을 만들어 달라 고 했 습 니 다.데이터 베이스 로 모든 아들 의 정 보 를 저장 하면 프로그램 으로 통계 하고 관리 할 수 있 습 니 다.
데이터베이스 의 구 조 는 다음 과 같다.
id
황자 의 유일한 번호
mother
황자 어머니 의 유일한 번호
황 제 는 비 를 두 등급 으로 나 누 었 다.천궁 마마(번호 가 25 보다 작 음)와 지궁 마마(번호 가 25 보다 크 면)는 천궁 마마 들 과 지궁 마마 들 의 출산 능력 이 어느 것 이 강하 고 어느 것 이 약 한 지 알 고 싶 었 다.그래서 프로그래머 는 SQL Query 를 쓰기 시작 했다.
방법 1:GROUP BY 사용
SQL QuerySELECT COUNT(*) FROM `prince` GROUP BY `mother` > 24;실행 결과
count(*)
50029
49971
100,000 줄 데이터 에서 의 운행 시간:0.0335 초
분석 하 다.
이런 그룹 바 이 방법의 가장 큰 문 제 는 얻 은 결 과 를 구분 할 수 없다 는 것 이다.이 두 숫자 중 어느 것 이 천궁 마마 들 이 낳 은 황자 수 이 고,어느 것 이 지하 궁 마마 들 이 낳 은 황자 수 입 니까?몰라.그래서 총 수 를 집계 해 냈 음 에 도 불구 하고 의미 가 없다.
따라서 통계 결 과 를 구분 하기 위해 서 는 조건 mother>24 도 하나의 필드 로 결과 에 한 필드 로 집중 적 으로 나타 나 야 합 니 다.수 정 된 sql 은 다음 과 같 습 니 다.SELECT COUNT(*) AS `number`, `mother` > 24 AS `type` FROM `prince` GROUP BY `mother` > 24;실행 결과
number type
50029 0
49971 1
조건 식 이 필드 일 때 이 필드 의 값 은 이 조건 식 의 값 입 니 다.따라서 우리 의 예 에 대응 하여 type=1 은 mother>24 의 값 이 1 이라는 것 을 의미 합 니 다.따라서 두 번 째 줄 의 숫자 는 지하 궁 마마 들 이 낳 은 황자 수 를 대표 합 니 다.
수정 을 거 친 후에 우 리 는 천궁 마마 들 이 한 수 위 라 는 것 을 알 게 되 었 다.
장단 점
단점 은 분명 하 다.조건 식 을 조별 근거 로 사용 하기 때문에 이원 적 인 구분 만 할 수 있 고 여러 가지 로 나 누 어 통 계 를 해 야 하 는 상황 에 대해 서 는 감당 할 수 없다.예 를 들 어 1∼10 번,11∼24 번,25∼50 번 비자 의 출산 자 수 를 각각 집계 하면 이 뤄 지지 않 는 다.
또 GROUP BY 를 사 용 했 기 때문에 정렬 과 관련 해 실행 시간 이 더 길다.
나 는 잠시 이런 방법의 장점 을 발견 하지 못 했다.
방법 2:끼 워 넣 은 SELECT 사용
포 함 된 SELECT 를 사용 하 는 것 도 목적 을 달성 할 수 있 습 니 다.각 SELECT 자구 에서 하나의 조건 에서 의 데 이 터 를 통계 한 다음 에 메 인 SELECT 로 이 통계 데 이 터 를 통합 시 킬 수 있 습 니 다.
SQL Query

SELECT 
  ( SELECT COUNT( * ) FROM `prince` WHERE `mother` >24 ) AS `digong`, 
  ( SELECT COUNT( * ) FROM `prince` WHERE `mother` <=24 ) AS `tiangong`
실행 결과
digong tiangong
49971 50029
100,000 줄 데이터 에서 의 운행 시간:0.0216 초
분석 하 다.
이런 SELECT 를 끼 워 넣 는 방법 은 매우 직관 적 이다.바로 각 조건 에서 의 수 치 를 각각 통계 한 다음 에 종합 하면 통속 적 이 고 이해 하기 쉬 우 며 자연 언어 와 별 차이 가 없다.
장단 점
직관 적 이 고 GROUP BY 보다 속도 가 빠르다 는 장점 이 있다.3 개의 SELECT 문구 로 GROUP BY 의 방안 보다 2 개의 문구 가 더 많아 보 였 지만 정렬 과 관련 이 없어 많은 시간 을 절약 했다.
단점 은 문장 이 조금 많 고 문장 수 에 결벽 증 이 있 는 학생 들 이 불편 할 수 있다 는 것 이다.
방법 3:CASE WHEN 사용
CASE WHEN 문 구 는 유연 한 조회 조건 을 정의 할 수 있 는 기능 이 강해 분류 통 계 를 하기에 적합 하 다.
SQL Query

SELECT 
  COUNT( CASE WHEN `mother` >24 THEN 1 ELSE NULL END ) AS `digong`, 
  COUNT( CASE WHEN `mother` <=24 THEN 1 ELSE NULL END ) AS `tiangong`
FROM prince
실행 결과
digong tiangong
49971 50029
100,000 줄 데이터 에서 의 운행 시간:0.02365825 초
분석 하 다.
이 방법의 관건 은COUNT( CASE WHEN `mother` >24 THEN 1 ELSE NULL END )
이곳 의 COUNT 와 CASE WHEN 이 공동으로 사용 해 분류 수 를 만 들 었 다.CASE WHEN 을 먼저 사용 하고,조건 이 충 족 될 때 필드 값 을 1 로 설정 하고,조건 이 충족 되 지 않 을 때 필드 값 을 NULL 로 설정 한 다음,COUNT 함 수 는 비 NULL 필드 만 계산 하기 때문에 문 제 를 해결한다.
장단 점
장점 은 이 방법 도 정렬 과 관련 이 없 기 때문에 운행 시간 은 방법 2 와 비슷 하고 SELECT 문 구 는 1 개 로 줄 었 다.
단점 은 문장 이 길 고 문장의 길이 에 결벽 증 이 있 는 학생 들 이 불편 할 수 있다 는 것 이다.
총결산
분 류 를 확정 하 는 조건 부 계수 에 대해 서 는 가능 한 한 GROUP BY 를 사용 하지 않 아 정렬 동작 을 피하 고 Query 의 실행 을 가속 화 할 수 있다.
만약 에 특정한 필드 의 값 에 따라 분류 해 야 한다 면 이 필드 의 값 은 가 변 적 인 것 이다.예 를 들 어 황 제 는 모든 비의 출산 자 수 를 통계 하려 고 하 는데 그 는 끊임없이 많은 비 를 얻 을 수 있다.이런 상황 에서 사용 방법 2 와 방법 3 은 그다지 영 광 스 럽 지 않 고 GROUP BY 를 사용 하 는 것 이 간단 하고 편리 하 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기