241111_TIL

J Lee·2024년 11월 11일
0

아무리 사소하더라도 배움이 없는 날은 없다.

SQL 문제풀이 복습


Leetcode

문제 링크
단순 join이지만 조건을 주는 게 어려운 문제.
group_concat의 default separator는 ,(콤마)라는 점도 기억해 두면 좋겠다.

join의 조건을 like를 써서 줄 수 있다는 점은 알고 있었는데,
concat으로 content와 word에 공백(띄어쓰기)을 주는 점을 떠올리는 게 어렵다.
공백을 꼭 줘야 하는 이유는 어딘가의 앞뒤에 붙어서 쓰이는 게 아니라
해당 단어가 단독으로 쓰이는 경우만을 골라내야 하기 때문.
(e.g. WAR만 해당하고 WARFARE 등은 해당하지 않아야 함)

이 때, content에도 %를 넣는 건 상관없지만
content와 word 모두 %를 빼게 되면 오류가 난다.
정확하게 앞쪽 띄어쓰기와 뒤쪽 띄어쓰기를 구분해 줄 필요가 있음.

SELECT post_id,
       IFNULL(GROUP_CONCAT(DISTINCT k.topic_id ORDER BY k.topic_id ASC),
       'Ambiguous!')
       AS "topic"
FROM   Posts p
       LEFT JOIN Keywords k
              ON CONCAT(' ', LOWER(p.content), ' ') LIKE
                 CONCAT('% ', LOWER(k.word), ' %')
GROUP  BY 1;

문제 링크
where절 쓸 필요 없이 전부 join의 조건으로 넣어서 구할 수도 있다.

SELECT DISTINCT p1.user_id
FROM   Purchases p1
       JOIN Purchases p2
         ON p1.user_id = p2.user_id
            AND p1.purchase_id <> p2.purchase_id
            AND p1.purchase_date >= p2.purchase_date
            AND DATEDIFF(p1.purchase_date, p2.purchase_date) <= 7
ORDER  BY 1;

문제 링크

SELECT DISTINCT r.driver_id,
                IFNULL(cnt, 0) AS "cnt"
FROM   Rides r
       LEFT JOIN (SELECT passenger_id,
                         COUNT(*) AS "cnt"
                  FROM   Rides
                  GROUP  BY 1) a
              ON r.driver_id = a.passenger_id;
profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보