Зачисление значка за каждое создание новой темы в категории?

У меня есть значок, который мои участники могут получать несколько раз — это значок «Книжный клуб». Он выдается за обсуждение книги месяца.

Каждый месяц создается новая тема о следующей книге, и все, кто отвечает, должны получать этот значок. В настоящее время это делается вручную, что очень утомительно.

Подскажите, пожалуйста, можно ли помочь мне составить SQL-запрос для значка, чтобы решить эту проблему?

Пользователь должен получать не более одного значка за тему — только при первом своем сообщении в этой теме. Это всегда один и тот же значок, который можно получать многократно.

Возможно ли это? Спасибо!

Может, кто-нибудь поможет с этим? Или где-то есть руководство по созданию Badge SQL?

Вы читали Topics tagged sql-triggered-badge?

Да, я прочитал все эти материалы.

Чуть-чуть страшно просто попробовать что-то на практике, так как некорректно составленный SQL-запрос на рабочем сайте может привести к серьёзным проблемам.

Есть ли тестовый режим или что-то подобное?

Я использую тестовый сервер для экспериментов.

Вы добились какого-либо прогресса в этом?

Как определяются темы книжного клуба? Они выделены в отдельную категорию или сгруппированы по тегу?

Дальше не буду. Я запутался в факторе множественного присвоения.

Все темы находятся в одной категории. Эта категория закрыта, поэтому создавать посты там могут только сотрудники, так что можно автоматически присваивать награды за любые ответы в этой категории.

Но мне нужно, чтобы система:

  • Присваивала значок за первый ответ каждого пользователя в каждой теме, но только один раз за тему;
  • Позволяла пользователю получать несколько одинаковых значков каждый раз, когда он отвечает в разных темах одной и той же категории.

Думаю, что что-то вроде этого может сработать:

WITH book_club_first_posts AS (

SELECT 
    p.topic_id,
    p.user_id,
    MIN(p.id) AS post_id
FROM posts p
  JOIN topics t ON t.id = p.topic_id
WHERE t.category_id = 5  -- замените на category_id вашего книжного клуба
    AND p.deleted_at ISNULL
    AND t.deleted_at ISNULL
    AND p.post_type = 1
    AND p.post_number <> 1
    AND p.user_id > 0
GROUP BY p.topic_id, p.user_id

)

SELECT bcfp.user_id, bcfp.post_id, p.created_at granted_at
FROM book_club_first_posts bcfp
  JOIN posts p ON p.id = bcfp.post_id
WHERE (:backfill OR p.id IN (:post_ids))

Спасибо, я попробую это скоро.

Отлично работает, спасибо!!