YS's develop story

MySQL ) 변수에 값을 할당하여 값 마다 다르게 정렬하는 쿼리 짜기 본문

Database/MySQL

MySQL ) 변수에 값을 할당하여 값 마다 다르게 정렬하는 쿼리 짜기

Yusang 2021. 2. 12. 08:50

MySQL ) 변수에 값을 할당하여 값마다 다르게 정렬하는 쿼리 짜기.

 

아래와 같이 Restaurant라는 테이블이 있습니다. 

 

 

또한 아래와 같이 Review라는 테이블이 있습니다.

 

 

마지막으로 아래와 같은 Area라는 테이블도 있습니다.

 

 

아래와 같은 쿼리를 작성하게 되면 식당 이름과 reviewCount, distance를 보여주게 됩니다.

select restaurantName,ifnull(reviewCount, 0) reviewCount,
       round(6371 *
             acos(cos(radians(areaLatitude)) * cos(radians(restaurantLatitude)) * cos(radians(restaurantLongitude)
                 - radians(areaLongitude)) + sin(radians(areaLatitude)) * sin(radians(restaurantLatitude))), 2)
           AS 'distance'

       from Restaurant
inner join Area
left outer join (select restaurantId, count(*) as reviewCount from Review group by restaurantId) ReviewCount
        on Restaurant.restaurantId = ReviewCount.restaurantId
where areaName = '성북' and Restaurant.status = 1;

MySQL ) 위도 경도를 활용하여 거리 계산하는 구문 작성하기

 

MySQL ) 위도 경도를 활용하여 거리 계산하는 구문 작성하기

MySQL 위도 경도를 활용해서 거리를 계산하는 구문을 작성해 봅시다. 위도, 경도를 저장하기 위한 자료형으로 decimal이 적합합니다. decimal(18,10)에서 18은 전체 자릿수, 10은 소수점 자릿수를 뜻합니

yusang.tistory.com

 

이를 특정 값에 따라 reviewCount가 높은 순서대로 정렬하거나

distance 값이 낮은 순서대로 정렬하기 위해서는 어떻게 해야 할까요?

 

 

아래와 같이 @var의 변수 선언을 통해 값을 할당해 주고

그 변수의 값에 따라 정렬 순서를 바꾸어 주는 쿼리입니다.

여기서 주의해야 할 점은 '@var :=1'의 의미는 오른쪽에 있는 값을 왼쪽에 대입한다는 의미입니다.

set @var := 1;

select restaurantName,ifnull(reviewCount, 0) reviewCount,
       round(6371 *
             acos(cos(radians(areaLatitude)) * cos(radians(restaurantLatitude)) * cos(radians(restaurantLongitude)
                 - radians(areaLongitude)) + sin(radians(areaLatitude)) * sin(radians(restaurantLatitude))), 2)
           AS 'distance'

       from Restaurant
inner join Area
left outer join (select restaurantId, count(*) as reviewCount from Review group by restaurantId) ReviewCount
        on Restaurant.restaurantId = ReviewCount.restaurantId
where areaName = '성북' and Restaurant.status = 1
order by CASE
              WHEN @var = 1 THEN distance
              END asc,
         CASE
              WHEN @var = 2 THEN reviewCount
              END DESC;

 

 

이를 활용하여서 변수의 값을 쿼리 스트링으로 받고,

그 값에 따라 정렬 순서가 다르게 보이는 api를 설계할 수 있겠죠.

Comments