https://school.programmers.co.kr/learn/courses/30/lessons/131118
SELECT A.REST_ID, A.REST_NAME, A.FOOD_TYPE, A.FAVORITES,A.ADDRESS, ROUND(AVG(B.REVIEW_SCORE),2) AS SCORE
FROM REST_INFO AS A
INNER JOIN REST_REVIEW AS B
ON A.REST_ID = B.REST_ID
WHERE SUBSTR(A.ADDRESS,1,2) = '서울'
GROUP BY A.REST_ID
ORDER BY SCORE DESC, A.FAVORITES DESC;
처음에 GROUP BY를 해주어야 한다는 것과, 점수의 평균값을 해주어야 한다는걸 제대로 파악하지 못하고 잘못 작성하였었다. 그리고 위의 경우는 해당 내용들을 고려해서 작성한 쿼리이고, 잘 통과할 수 있다.
이때에 다른 사람의 풀이들을 찾아보면,
WHERE 을 사용하지 않고, GROUP BY 후에 HAVING을 통해서 조건을 만족하는 것들을 걸러내서 처리하기도 하는데, 해당 형태의 코드를 첨부해보면,
SELECT A.REST_ID, B.REST_NAME, B.FOOD_TYPE, B.FAVORITES, B.ADDRESS, ROUND(AVG(A.REVIEW_SCORE),2) AS SCORE
FROM REST_REVIEW A
JOIN REST_INFO B ON A.REST_ID = B.REST_ID
GROUP BY A.REST_ID
HAVING B.ADDRESS LIKE '서울%'
ORDER BY SCORE DESC, B.FAVORITES DESC
이와 같다.
알고리즘 문제 풀이와 같이, SQL 문제의 경우도 여러가지 형태로 작성해서 통과할 수 있는 결과물을 얻을 수 있다.
이때에 SUBSTRING(A.ADDRESS, 1, 2) = '서울' 을 사용하는 것과, HAVING B.ADDRESS LIKE '서울%' 을 사용하는 형태의 차이가 있다. 둘다 잘 익혀서 어느것을 사용하던지 필요할때 해결해낼 수 있도록 하자.
이때에 WHERE은 절이고, HAVING은 함수이다.
아마 GROUP BY 를 이용하고 나서는 HAVING을 써서 원하는 조건을 만족하는 것들을 걸러내는것이 더 일반적으로 사용하는 형태이지 않을까 싶다.
재미난 부분은 그동안 별칭을 사용할때 AS를 사용했는데 위에 참고한 코드는 그런것 없이 그냥 띄어쓰기 후에 바로 별칭으로 사용할 A, B 등을 써서 사용하고 있다.
물론 쓰는 내용은 적지만 나의 경우는 꼭 AS를 적어서 표현하도록 하자.
그리고 JOIN의 경우는 그냥 JOIN 이라고 적으면 기본적으로 INNER JOIN 으로 동작한다.
그래도 INNER JOIN 이라고 작성하고 코드를 작성하도록 하자.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 LV 2. 131115 가격이 제일 비싼 식품의 정보 출력하기 MySQL (0) | 2023.11.21 |
---|---|
프로그래머스 LV 4. 오프라인/온라인 판매 데이터 통합하기 MySQL (0) | 2023.11.21 |
프로그래머스 LV 1. 59405 상위 n개 레코드 MySQL (0) | 2023.11.19 |
프로그래머스 LV 1. 59404 여러 기준으로 정렬하기 MySQL (0) | 2023.11.19 |
프로그래머스 LV 1. 동물의 아이디와 이름 MySQL (0) | 2023.11.19 |