mysql 스칼라 서브쿼리? 에 대하 질문이 있습니다 0 5 724

by 토마톰 [MySQL] [2021.03.03 00:15:28]


제가 이해하기로는 단일로우의 단일값을 select 절에서 뽑는것을 스칼라 쿼리라고 알고있습니다

아래 쿼리는 tmpMedia의 media_id 마다의 media테이블의 특정 시점 이전의 가장 최근 seq를 가져오기 위한 쿼리입니다

근데 여기서 궁금한게 subquery의 결과가 쿼리를 날릴때마다 서로 다른 두개의 값을 가져오는 경우가 있다는것 입니다. 마치 desc limit 1이 걸렸다가 안걸렸다가 하는 결과처럼요
그래서 조건에 맞는 max(seq)를 가져왔다가 min(seq)를 갖고왔다가 이 두개가 번갈아가면서 반복이 되는데 도저히 이유를 모르겠습니다.

특정 video_id에서만 이런경우가 있으니 데이터 문제인가 싶어서 아무리 관련해서 찾아봐도 문제점이 될만한 요소를 모르겠고... 혹시 아래 쿼리와같이 서브쿼리시 order by에 사용에 대한 문제점이 있거나 하는 부분이 있을까요??

SELECT
	, A1.media_id
    , (SELECT seq FROM media WHERE media_id = A1.media_id AND datehh < @datehh ORDER BY datehh DESC LIMIT 1) last_seq
FROM tmpMedia A1 
;

 

by 마농 [2021.03.03 08:20:20]

정렬기준이 유일해야 합니다.
datehh 만으로는 중복이 가능하니 정렬 기준을 추가해야 합니다.
ORDER BY datehh DESC, seq DESC


by 토마톰 [2021.03.03 08:48:06]

답변 감사드립니다!

추가로 좀 여쭤보자면 

SELECT seq FROM media WHERE media_id = A1.media_id AND datehh < @datehh ORDER BY datehh DESC LIMIT 1

서브쿼리인 위 쿼리를 where media_id 값을 임의로 하나를 박고 쿼리를 날리면 실제로 datehh에 중복된 데이터가 없어서 무조건 하나의 값이 나오는게 맞는것은 확인 했습니다. 다만 본문처럼 서브쿼리로 놓는순간 seq값이 계속 max와  min값으로 바뀌네요

그리고 또 이상한것은 위 쿼리의 select절만 seq가 아닌 예를들어 regdate같은 다른값을 같이 뽑아보면 정상적인 하나의값이 계속 잘 나온다는것 입니다. 즉 seq값이 계속 바뀌고 다른 컬럼값들은 가져와야할 row의 값을 계속 뽑아냅니다..

 

SELECT
    , A1.media_id
    , (SELECT seq FROM media WHERE media_id = A1.media_id AND datehh < @datehh ORDER BY datehh DESC LIMIT 1) -- datehh < @datehh 에 속한 min과 max가 번갈아가면서 찍힘
    , (SELECT regdate FROM media WHERE media_id = A1.media_id AND datehh < @datehh ORDER BY datehh DESC LIMIT 1) -- 정상적인 seq의 row에 해당하는 값이 제대로 찍힘
FROM tmpMedia A1 
;

 


by 마농 [2021.03.03 09:02:20]

조건절에 변수가 들어가네요?


by 토마톰 [2021.03.03 09:41:01]

네 맞습니다 변수 @datehh는 Ymdh 형식의 값입니다

SP안에서 돌아가는 쿼리이구요


by 마농 [2021.03.03 09:53:05]

글쎄요? 원하는 값이 안나온다면? 버그일 가능성도 있겠네요.
버그라면 쿼리를 정상 출력되는 다른 방식으로 변경해야 할 것 같습니다.
쿼리 일부분만 봐서는 판단이 어렵네요.

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