SQL 문제풀이 복습
문제 링크
단순 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;