diff --git a/internal/repository/letter_outgoing_repository.go b/internal/repository/letter_outgoing_repository.go index dd68e86..360fa5b 100644 --- a/internal/repository/letter_outgoing_repository.go +++ b/internal/repository/letter_outgoing_repository.go @@ -558,21 +558,19 @@ func (r *LetterOutgoingRecipientRepository) CountUnreadByUser(ctx context.Contex var count int64 sql := ` - SELECT COUNT(*) FROM ( - SELECT * FROM letter_outgoing_recipients - WHERE user_id = ? AND read_at IS NULL - AND id IN ( - SELECT id FROM ( - SELECT id, ROW_NUMBER() OVER (PARTITION BY letter_id ORDER BY created_at DESC) as rn - FROM letter_outgoing_recipients - WHERE user_id = ? - ) ranked - WHERE rn = 1 - ) - ) result + WITH valid_recipients AS ( + SELECT lor.id, lor.letter_id, lor.read_at, lor.created_at, + ROW_NUMBER() OVER (PARTITION BY lor.letter_id ORDER BY lor.created_at DESC) as rn + FROM letter_outgoing_recipients lor + INNER JOIN letters_outgoing l ON l.id = lor.letter_id AND l.deleted_at IS NULL + WHERE lor.user_id = ? + ) + SELECT COUNT(*) + FROM valid_recipients + WHERE rn = 1 AND read_at IS NULL ` - if err := db.WithContext(ctx).Raw(sql, userID, userID).Scan(&count).Error; err != nil { + if err := db.WithContext(ctx).Raw(sql, userID).Scan(&count).Error; err != nil { return 0, err } return int(count), nil diff --git a/internal/repository/letter_repository.go b/internal/repository/letter_repository.go index 81420c9..bc6bc33 100644 --- a/internal/repository/letter_repository.go +++ b/internal/repository/letter_repository.go @@ -923,21 +923,19 @@ func (r *LetterIncomingRecipientRepository) CountUnreadByUser(ctx context.Contex var count int64 sql := ` - SELECT COUNT(*) FROM ( - SELECT * FROM letter_incoming_recipients - WHERE recipient_user_id = ? AND read_at IS NULL - AND id IN ( - SELECT id FROM ( - SELECT id, ROW_NUMBER() OVER (PARTITION BY letter_id ORDER BY created_at DESC) as rn - FROM letter_incoming_recipients - WHERE recipient_user_id = ? - ) ranked - WHERE rn = 1 - ) - ) result + WITH valid_recipients AS ( + SELECT lir.id, lir.letter_id, lir.read_at, lir.created_at, + ROW_NUMBER() OVER (PARTITION BY lir.letter_id ORDER BY lir.created_at DESC) as rn + FROM letter_incoming_recipients lir + INNER JOIN letters_incoming l ON l.id = lir.letter_id AND l.deleted_at IS NULL + WHERE lir.recipient_user_id = ? + ) + SELECT COUNT(*) + FROM valid_recipients + WHERE rn = 1 AND read_at IS NULL ` - if err := db.WithContext(ctx).Raw(sql, userID, userID).Scan(&count).Error; err != nil { + if err := db.WithContext(ctx).Raw(sql, userID).Scan(&count).Error; err != nil { return 0, err } return int(count), nil