특정 주제가 생성된 지 2일 이내의 사용자는 제외되도록 필터를 하나 더 추가하려고 합니다.
아래와 같이 시도해 보았어요. SQL은 아직 초보 단계라 어떻게 진행해야 할지 잘 모르겠습니다. 도움 주실 수 있나요?
SELECT *
FROM topic t post_actions pa INNER JOIN users u ON u.id = pa.user_id
WHERE post_id = 1
AND post_action_type_id = 2
AND u.created_at < t.created_at-2
특정 주제가 생성된 지 2일 미만으로 가입된 사용자를 제외하기 위해 날짜 필터를 수정하려고 합니다. datediff나 INTERVAL을 사용하라는 조언을 받았지만, 둘 다 작동하지 않고 있습니다.
또한, 주제 t를 다른 내부 조인(inner join)으로 추가하는 데 도움이 필요했는데, 다음과 같이 해결했습니다: FROM post_actions pa INNER JOIN users u ON u.id = pa.user_id INNER JOIN topics t on t.id = t.id
t.id가 미리보기 대신 숫자로 표시되는데, 이 부분도 해결할 방법이 있을까요?
이 방법으로 작동하는 것 같습니다. 이 쿼리로 1000개 이상의 결과가 나와서 다음을 추가해 봤습니다. AND t.id = post.topic_id
이렇게 하면 목록이 16개 결과로 줄었지만, 여전히 동일한 항목이 4개 있었습니다. 어떻게 수정해야 할지 모르겠네요.
SELECT
t.id as topic_id,
pa.post_id,
pa.user_id,
pa.created_at,
u.created_at
FROM post_actions pa INNER JOIN users u ON u.id = pa.user_id INNER JOIN topics t on t.id = t.id INNER JOIN posts p on p.topic_id = p.topic_id
WHERE post_id = 15000
AND t.id = 7000
AND post_action_type_id = 2
AND u.created_at < t.created_at - INTERVAL '2 DAY'
수정: INNER JOIN posts p on p.topic_id = p.topic_id
를 INNER JOIN posts p on p.topic_id = t.id
으로 변경했는데, 이전처럼 16개 결과로 줄었습니다.
이제 여전히 16개가 나오는 이유는 t.id = t.id 때문이라고 생각합니다. 그런데 이걸 어떻게 바꿔야 할지 모르겠네요
다만 이 방법에는 몇 가지 문제가 있습니다. 다만 SQL에 능숙하지 않아서 모든 부분을 자세히 설명하기는 어렵습니다.
이미 post_id를 가지고 있다면 topic_id는 필요하지 않을 것입니다. post_id는 해당 게시물(및 토픽)에 고유하기 때문입니다. 또한 일부 추가 테이블을 두 번째 테이블에 없는 필드로 조인하려는 것 같습니다(예: t.id = t.id는 topics 테이블 내에서 정확히 동일한 필드입니다). 그리고 쿼리하는 토픽이 정적(static)이라면, 항상 동일한 날짜(예: 게시물 15000이 생성된 지 2일 전)가 되므로 상대적인 INTERVAL 대신 명시적인 날짜로 설정할 수 있습니다.
아직 제 버전을 직접 테스트해 보지는 못했지만, SQL/배지 관련 기술의 대부분은 Meta에서 다양한 예시를 검색하고 그 조각들을 모으는 과정에서 배웠습니다. 많은 예시가 data-explorer 태그 아래에 있으며, Some common badge queries idea에는 다양한 용도의 예시가 많이 있으니 참고해 보시는 것도 좋을 것 같습니다.
여기서 무엇을 원하시는지 아직 정확히 이해하지 못했지만, post_id와 새 사용자를 포함할 시작 날짜를 알고 있다면 이렇게 해보는 건 어떨까요?
-- [params]
-- int :post_id
-- date :date
SELECT pa.user_id,
pa.created_at AS reltime$time
FROM post_actions pa
JOIN users u ON u.id = pa.user_id
WHERE pa.post_id = :post_id
AND post_action_type_id = 2
AND u.created_at::date > :date
ORDER BY pa.created_at DESC
이 쿼리는 특정 게시글을 '좋아요’한 사용자 목록을 반환하며, 입력한 날짜 이후에 계정을 생성한 사용자들만 포함됩니다(좋아요를 누른 시간순 정렬).