게시물 생성 x일 전에 생성된 계정의 좋아요 필터링

안녕하세요,

특정 주제가 생성된 지 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가 미리보기 대신 숫자로 표시되는데, 이 부분도 해결할 방법이 있을까요?

이 경우에는 t.id AS topic_id로 별명을 지정하면 됩니다. 그러면 자동으로 잘 동작할 것입니다. :+1:

이 주제에서 사용할 수 있는 Explorer의 마법 같은 기능에 대한 몇 가지 추가 예시도 있습니다 - IDs in Data Explorer - #3 by tshenry

'특정 주제’라고 하셨을 때, 매번 동일한 주제(즉, 정적인 주제 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에 능숙하지 않아서 모든 부분을 자세히 설명하기는 어렵습니다. :slightly_smiling_face:

이미 post_id를 가지고 있다면 topic_id는 필요하지 않을 것입니다. post_id는 해당 게시물(및 토픽)에 고유하기 때문입니다. 또한 일부 추가 테이블을 두 번째 테이블에 없는 필드로 조인하려는 것 같습니다(예: t.id = t.id는 topics 테이블 내에서 정확히 동일한 필드입니다). 그리고 쿼리하는 토픽이 정적(static)이라면, 항상 동일한 날짜(예: 게시물 15000이 생성된 지 2일 전)가 되므로 상대적인 INTERVAL 대신 명시적인 날짜로 설정할 수 있습니다.

아직 제 버전을 직접 테스트해 보지는 못했지만, SQL/배지 관련 기술의 대부분은 Meta에서 다양한 예시를 검색하고 그 조각들을 모으는 과정에서 배웠습니다. :slight_smile: 많은 예시가 data-explorer 태그 아래에 있으며, Some common badge queries idea에는 다양한 용도의 예시가 많이 있으니 참고해 보시는 것도 좋을 것 같습니다.

네, 알아요. 그런데 주제 ID를 위한 AND 조건을 제거하면 어떤 이유로든 결과가 다시 1000개로 올라가요. 보내주신 링크를 확인해 볼게요. 거기에 문제를 해결할 수 있는 방법이 있기를 바라요.

여기서 무엇을 원하시는지 아직 정확히 이해하지 못했지만, 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

이 쿼리는 특정 게시글을 '좋아요’한 사용자 목록을 반환하며, 입력한 날짜 이후에 계정을 생성한 사용자들만 포함됩니다(좋아요를 누른 시간순 정렬).

모든 것이 정상적으로 작동하도록 설정했고, reltime에 대해 전혀 몰랐는데 이제 그걸 구현했습니다. 도움을 주셔서 다시 한번 감사드립니다!

마지막으로 reltime에 대해 한 가지 질문이 있습니다. 이름을 "time"에서 "주제 생성"으로 변경할 수 있는 방법이 있나요?

그렇습니다. :slightly_smiling_face: reltime$topic_created로 변경하면 해결될 겁니다. :+1: