쿼리문조언 0 7 586

by 신의한수 [2019.11.20 08:50:21]


안녕하세요

현재 이력서 관련 프로그램을 진행중인데요

작업중에 막히는 부분이 있어 조언을 구하고자 합니다.

아래부분은 현재 구현중인 로직입니다.

잘못된 부분에 대해 조언좀 부탁드립니다.

-- 테이블
resume : 이력서 기본정보
resume_eduinfo : 학력정보(여러개)
resume_career : 경력정보(여러개)

* 검색을 통해 경력중에 마지막 퇴직시의 직급을 검색되게 하고 싶은데요.
아래 처럼 구현을하니 re_car_position이 모두 동일한값으로 나옵니다.

잘못된 부분에 대한 조언좀 부탁드립니다.

SELECT x.re_idx
	 , x.re_id			-- 회원아이디
	 , x.re_name			-- 회원이름
	 , x.re_photo			-- 회원사진
	 , x.re_subject			-- 이력서제목
	 , y.re_idx AS eidx
	 , y.re_sch_code		-- 학교코드(최종학력)
	 , y.re_sch_edtp		-- 졸업여부
	 , z.re_car_position		-- 경력(퇴직시 직급)
  FROM resume x
 INNER JOIN
	   (SELECT re_idx, re_id
			 , MAX(re_sch_code) AS re_sch_code
			 , re_sch_edtp
		  FROM resume_eduinfo
		 GROUP BY re_id
		) y
	ON x.re_id = y.re_id
 INNER JOIN
	   (SELECT re_car_position
		  FROM resume_career
		 WHERE re_car_leave=2
		 ORDER BY re_car_edt DESC
		 LIMIT 1
		) z
	ON z.re_id = x.re_id
 WHERE 1=1 
 ORDER BY x.re_wdate DESC
 LIMIT 0, 20 

 

by 우리집아찌 [2019.11.20 09:28:24]

resume_career 도 group by 해주셔여 합니다

inner join도 outer로 바꿔주셔야 빠지는 대이터가 없어 보입니다


by jkson [2019.11.20 10:26:19]

resume_career 인라인뷰를 select 절 스칼라서브쿼리로 바꾸시든..


by 마농 [2019.11.21 09:05:51]

y 부분은 re_id 로 집계하여 1건을 가져오고 있고,
MAX(re_sch_code) 로 최종학력 코드를 가져오고 있기는 하지만,
나머지 항목들(re_idx, re_sch_edtp)은 정확하게 최종것을 가져온다고 할 수 없습니다.
MySQL 에서만 오류가 나지 않는 비표준 그룹바이 구문입니다.
다른 항목들도 최종학력코드에 맞는 값들을 가져오려면
서브쿼리나 셀프조인 등의 방식으로 해당 테이블을 두번 읽어야 합니다.
분석함수가 가능한 최신버전 이라면 row_number 를 이용해 쉽게 구할 수도 있습니다.

최종학력의 경우도 MAX(re_sch_code) 가 최종학력이 맞나요?
re_sch_code 가 학력코드이고 학력에 따라 정렬되어 있다면 맞겠지만?
re_sch_code 가 학교코드라면? 틀린것 같은데요?


by 신의한수 [2019.11.26 09:01:19]

이제야 확인을 했습니다.

우리집 아찌님의 말씀대로 수정을 했구요.

마농님의 말씀처럼 "MySQL 에서만 오류가 나지 않는 비표준 그룹바이 구문" 이라는게 정확히 무엇을 말씀하시는지 이해가 가질 않습니다.

정확히 어떻게 GROUP BY문을 사용해야 되는지 조언좀 부탁드립니다. (솔직히 GROUP BY문이 좀 헷갈리네요. 자료를 찾아봐도 그렇구요^^)

또한 re_sch_code 코드는 학력에 따라 정렬되어있습니다.


by 마농 [2019.11.26 09:41:18]

re_id 별로 re_sch_code 의 최대값을 구하는 집계 쿼리입니다.
그런데 여기에 생뚱맞게 re_sch_edtp 와 re_idx 항목이 집계함수 없이 사용이 되고 있네요.
이 부분이 그룹바이 쿼리에서 잘못 사용되고 있는 부분입니다.
다른 DBMS 에서는 허용되지 않는 오류 구문이구요.
 

SELECT re_id
     , MAX(re_sch_code) AS re_sch_code
     , re_sch_edtp    -- 여기
     , re_idx         -- 여기
  FROM resume_eduinfo
 GROUP BY re_id
;

 


by 신의한수 [2019.11.28 22:14:23]

답변감사합니다.

re_sch_edtp, re_idx값도 노출시켜야하는 부분이라 그렇게 처리를 했습니다.


by 마농 [2019.11.29 08:35:11]

최대값을 보고 싶은지? 함계인지? 평균인지? 등
어떻게 집계해서 볼 것인지를 생각해야 합니다.
집계하지 않고 그냥 조회한다는게 말이 안됩니다.
re_id 별로 하나의 값으로 집계하는 구문입니다.
집계하여 하나의 값을 조회해야 하는데
그냥 집계 없이 여러개의 값을 봐야 한다는 거기 때문에 문맥이 맞지 않습니다.
다른 DB 에서는 허용이 되지 않는 오류 구문이고
MySQL 에서는 오류는 나지 않습니다.
집계함수를 사용하지 않았기 때문에 제일 처음 읽은 값 하나가 나오게 됩니나.
즉, 최종학력과 무관한 자료가 출력되게 됩니다.(처음 읽은 값)

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입