YS's develop story
MySQL ) 변수에 값을 할당하여 값 마다 다르게 정렬하는 쿼리 짜기 본문
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 ) 위도 경도를 활용하여 거리 계산하는 구문 작성하기
이를 특정 값에 따라 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를 설계할 수 있겠죠.
'Database > MySQL' 카테고리의 다른 글
MySQL ) 중복된 결과를 제거하는 distinct (0) | 2021.03.09 |
---|---|
MySQL ) LIMIT을 활용하여 페이징 쿼리 구현하기 (2) | 2021.02.13 |
MySQL ) left outer join 활용, ifnull 활용 (0) | 2021.02.11 |
MySQL ) 기존 컬럼에서 값을 +1 해주기 (1) | 2021.02.10 |
MySQL 에러 ) Server returns invalid timezone. Need to set 'serverTimezone' property. (1) | 2021.02.08 |
Comments