쪼렙 as! 풀스택

MySQL, 정렬한 기준으로 1:1로 Join 해서 데이터 가져오기. group by 안쓰고 해결;; 본문

개발 일지/Web & Server

MySQL, 정렬한 기준으로 1:1로 Join 해서 데이터 가져오기. group by 안쓰고 해결;;

코코앱 2019. 9. 3. 18:24

정말 어렵고 힘들었다.

 

너무 힘들었어서, 자세히 쓰기도 귀찮다.

 

내가 원한 결과.

1:N 의 데이터가 나오는 INNER JOIN 을 한후,

'dealAt' 이라는 컬럼으로 DESC 정렬을 한 후에,

가장 최신의 데이터 하나만 선택해서,

결과적으로 1:1 의 데이터만 가져오는 JOIN 을 하고 싶었다.

 

첫번째 시도. 서브쿼리를 이용해서, JOIN 을 한 후, Group BY 를 하는 것이다.

 

 select * from (

        select id, name, hp from member order by date desc

   )a group by id

[출처] group by 내부 정렬방법|작성자 zgabriel

 

이런식이였다.

 

그런데, 서브 쿼리 안에서 이미 JOIN 을 하고 이미 ORDER BY DESC 가 되어있었지만,

GROUP BY 만 하면, 정렬되지 않은채 그룹이 묶여버렸다. 미칠 노릇....

 

그래서 다른 방법으로,

정렬을 한후, 한 ID기준으로 그룹별 rank 를 메겨주고,

WHERE rank = '1' 인것만 가져오기로 했다.

 

일단, 그룹별 rank 메기는 법 참고.

https://blackbull.tistory.com/43

 

이것을 참고해서, 조인을 하고, 정렬을 한후, 랭크를 먹이고, rank = '1'인것만 가져와서 해결하였다.

 

 

SELECT pnu, lat, lng, dealAt, price, rnum FROM (
	SELECT *,
		(CASE @vpnu WHEN A.pnu THEN @rownum:=@rownum+1 ELSE @rownum:=1 END) rnum,
    	(@vpnu:=A.pnu) vpnu
	FROM (
		SELECT T.pnu, T.lat, T.lng, D.dealAt, D.price FROM my_table_toji T 
		INNER JOIN my_table_deal D ON T.pnu = D.pnu
		WHERE T.lat > 37.4 AND T.lng > 127.0 AND T.lat < 37.4 AND T.lng < 127.0
		ORDER BY T.pnu,  D.dealAt DESC
	)A 
)B

WHERE B.rnum = '1';

 

 

 

 

 

 

 

 

 

 

 

Comments